Future模式 --先給你提貨帶

定義:

獲取Future角色的線程會在稍後使用Future角色來獲得運行的結果。

引例:

類的一覽表
名字 說明
main 向host發出請求並獲取數據
data 表示訪問數據方法的接口。
host 向請求返回futuredata實例的類
futuredata 表示提貨帶類
realdata 表示真實數據
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");
    }
}
public interface Data {
    public abstract String getContent();
}
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();
    }
}
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;
    }
}
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;
    }
}

 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(10, A) BEGIN
        making RealData(30, C) BEGIN
        making RealData(20, B) BEGIN
        making RealData(10, A) END
main otherJob END
data1 = AAAAAAAAAA
        making RealData(20, B) END
data2 = BBBBBBBBBBBBBBBBBBBB

Future模式出現的角色:

client(請求者):client向host發出請求request,並立刻接收一個處理結果(虛擬數據)

host:host角色會創建新的線程,並開始在新的新的線程中創建realdara角色。

virtualdata(虛擬數據):virtualdata角色是讓future角色與realdata角色具有一致性的角色。

realdata(真實數據):realdata角色表示真實的角色,創建該對象會花費很多時間。

future(期貨):future角色是“提貨帶”,由host角色傳遞給client角色。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章