Future模式

http://blog.csdn.net/achilles_dynasty/article/details/6076295


先由一个例子引入什么是Future Pattern。

【例子】我去蛋糕店取蛋糕,下订单后,店员请我"请在天黑后再来店里取货",并给我一张提货单。在店员做蛋糕的时候,我可以陪MM逛街,看电影等,而不需要在蛋糕店外等候。黄昏后,我拿着这张提货单到蛋糕店来取货。店员说了声"先生,你的蛋糕好了",并把蛋糕给了我。

 

上面的例子就是Future Pattern的一个直观的使用例子。

  1. 假设有一个执行起来要花很久的方法(如做蛋糕),我们不需要等待结果完全出来了(蛋糕做好),而是获取一张替代的"提货单"。获取提货单不需要太长的时间,这个提货单就是Future参与者
  2. 获取Future参与者的线程,会在事后再去执行结果,就好像拿着提货单取蛋糕一样。如果已经有执行结果了,就马上拿到数据。如果还没有,则继续等待到执行结果完全出来为止。

上面就是一此完整的Future Pattern的运行模式。

 

下面提供一段范例程序。

首先介绍一下范例程序包含的一些类和接口:

  1. Main              说明:对Host送出请求,获取数据的类。
  2. Host              说明:对请求返回FutureData的类。
  3. Data              说明:表达数据访问方式的接口,FurureData与RealData都实现了这个接口。
  4. FurureData    说明:RealData的提货单类,而RealData实例则有其他线程建立。
  5. RealData        说明:表达实际数据的类,执行构造器要花一定的时间。
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  


你可能感兴趣的:(Future模式)