http://blog.csdn.net/achilles_dynasty/article/details/6076295
先由一个例子引入什么是Future Pattern。
【例子】我去蛋糕店取蛋糕,下订单后,店员请我"请在天黑后再来店里取货",并给我一张提货单。在店员做蛋糕的时候,我可以陪MM逛街,看电影等,而不需要在蛋糕店外等候。黄昏后,我拿着这张提货单到蛋糕店来取货。店员说了声"先生,你的蛋糕好了",并把蛋糕给了我。
上面的例子就是Future Pattern的一个直观的使用例子。
上面就是一此完整的Future Pattern的运行模式。
下面提供一段范例程序。
首先介绍一下范例程序包含的一些类和接口:
package com.pattern.thread.future; public class Main { public static void main(String[] args) { System.out.println("main BEGIN"); Host host = new Host(); Data data1 = host.request(10, 'A'); Data data2 = host.request(20, 'B'); Data data3 = host.request(30, 'C'); System.out.println("main otherJob BEGIN"); try { Thread.sleep(2000); } catch (InterruptedException e) { } System.out.println("main otherJob END"); System.out.println("data1 = " + data1.getContent()); System.out.println("data2 = " + data2.getContent()); System.out.println("data3 = " + data3.getContent()); System.out.println("main END"); } }
package com.pattern.thread.future; public class Host { public Data request(final int count, final char c) { System.out.println(" request(" + count + ", " + c + ") BEGIN"); // (1)建立FutureData的实例 final FutureData future = new FutureData(); // (2)为了建立RealData的实例,启用新的线程 new Thread() { public void run() { RealData realdata = new RealData(count, c); future.setRealData(realdata); } }.start(); System.out.println(" request(" + count + ", " + c + ") END"); // (3)取回FutureData实例,作为返回值 return future; } }
package com.pattern.thread.future; public interface Data { public abstract String getContent(); }
package com.pattern.thread.future; public class FutureData implements Data { private RealData realdata = null; private boolean ready = false; public synchronized void setRealData(RealData realdata) { if (ready) { return; // balk } this.realdata = realdata; this.ready = true; notifyAll(); } public synchronized String getContent() { while (!ready) { try { wait(); } catch (InterruptedException e) { } } return realdata.getContent(); } }
package com.pattern.thread.future; public class RealData implements Data { private final String content; public RealData(int count, char c) { System.out.println(" making RealData(" + count + ", " + c + ") BEGIN"); char[] buffer = new char[count]; for (int i = 0; i < count; i++) { buffer[i] = c; try { Thread.sleep(100); } catch (InterruptedException e) { } } System.out.println(" making RealData(" + count + ", " + c + ") END"); this.content = new String(buffer); } public String getContent() { return content; } }
main BEGIN request(10, A) BEGIN request(10, A) END request(20, B) BEGIN request(20, B) END request(30, C) BEGIN request(30, C) END main otherJob BEGIN making RealData(30, C) BEGIN making RealData(10, A) BEGIN making RealData(20, B) BEGIN making RealData(10, A) END main otherJob END data1 = AAAAAAAAAA making RealData(20, B) END data2 = BBBBBBBBBBBBBBBBBBBB making RealData(30, C) END data3 = CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC main END