1. 程式人生 > >並行程式設計模式-future模式

並行程式設計模式-future模式

future模式概念

客戶端傳送一個長時間的請求,服務端不需等待該資料處理完成便立即返回一個偽造的代理資料(相當於商品訂單,不是商品本身),使用者也無需等待,先去執行其他的若干操作後,再去呼叫伺服器已經完成組裝的真實資料。該模型充分利用了等待的時間片段。

傳統的獲取資料的方式

這裡寫圖片描述

使用future模式的資料獲取方式

這裡寫圖片描述

程式碼結構

這裡寫圖片描述

類圖
這裡寫圖片描述

這裡寫圖片描述

程式碼

package test;

public class RealData implements Data {

    protected  String result ;

    public RealData
(String param) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < 10; i++) { sb.append(param); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } result = sb.toString(); } @Override
public String getResult() { return result; } }
package test;

public class Client {

    public Data request(final String queryStr) {

        final FutureData future = new FutureData(); 

        new Thread(){

            public void run(){
                RealData realData = new
RealData(queryStr); future.setRealData(realData); } }.start(); //一開始直接返回future,將耗時的初始化操作放到執行緒中執行 return future; } }
package test;

public interface Data {

    public String getResult();
}
package test;

public class FutureData implements Data {

    private RealData realData = null;

    private boolean isReady = false;

    public synchronized void setRealData(RealData realData) {

        System.out.println("進入FutureData的setRealData()");

        while (isReady) {
            return;
        }

        this.realData = realData;
        isReady = true;
        notifyAll();

        System.out.println("執行了notifyAll()");
    }

    @Override
    public synchronized String getResult() {

        System.out.println("進入FutureData的getResult()");
        while (!isReady) {
            try {
                System.out.println("執行了wait()");
                wait();
                System.out.println("喚配了wait()");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        //真實資料構造完成後,再獲取真實資料的結果
        return realData.result;

    }

}
package test;

public class FutureTest {

    public static void main(String[] args) {

        Client client = new Client();
        Data data = client.request("param");

        //一段長時間的業務邏輯,可以處理其他事情
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("real Data:"+data.getResult());


    }

}

執行FutureTest ,輸出:
進入FutureData的getResult()
執行了wait()
進入FutureData的setRealData()
執行了notifyAll()
喚配了wait()
real Data:paramparamparamparamparamparamparamparamparamparam