並行程式設計模式-future模式
阿新 • • 發佈:2019-02-11
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