前言 :
我去蛋糕店買蛋糕, 下訂單後, 店員請我天黑之後來店取貨, 並給我一張提貨單. 黃昏後, 我就拿著這張提貨單到蛋糕店取貨. 店員拿著提貨單並將我要的蛋糕交給我. 這章要學習的是Future Pattern. 假設有一個執行需要一點時間的方法, 我們就不要等待執行結果出來, 而是獲取一張替代的”提貨單”. 因為領取提貨單並不需要時間, 這時這個提貨單就是 Future 參予者.
在繼續本章前, 請務必先看過 Thread-Per Message Pattern.
Future Pattern 所有參予者 :
Client (委託人) 參予者 :
Host 參予者 :
VirtualData 參予者 :
RealData 參予者 :
Future 參予者 :
範例程式 :
Future Pattern UML 類圖 :
* Main 類 :
Main 類會調用 Host 的 request 方法來獲取 Data, 之後接著呼叫Data 的 getContent 來顯示 Data 內容. 代碼如下 :
* Host 類 :
Host 類會提供request 方法來產出 Data. 一開始會先建立 FutureData 的物件並回傳. 而後接著開啟線程進行 RealData 的製作並將之傳入 FutureData中. 代碼如下 :
* IData 接口 :
IData 接口是用來表現數據的訪問方式的接口. FutureData 與 RealData 都實現這個接口. 代碼如下 :
* FutureData 類 :
FutureData類在Future Pattern 代表 "提貨單". 代碼如下 :
* RealData :
就是前言介紹的"蛋糕", 在製造過程中需要花費時間等待. 代碼如下 :
執行結果 :
補充說明 :
@. 能夠提升throughput 嗎 :
@. 變形 – 不讓人等待的 Future參予者 :
我去蛋糕店買蛋糕, 下訂單後, 店員請我天黑之後來店取貨, 並給我一張提貨單. 黃昏後, 我就拿著這張提貨單到蛋糕店取貨. 店員拿著提貨單並將我要的蛋糕交給我. 這章要學習的是Future Pattern. 假設有一個執行需要一點時間的方法, 我們就不要等待執行結果出來, 而是獲取一張替代的”提貨單”. 因為領取提貨單並不需要時間, 這時這個提貨單就是 Future 參予者.
在繼續本章前, 請務必先看過 Thread-Per Message Pattern.
Future Pattern 所有參予者 :
Client (委託人) 參予者 :
Host 參予者 :
VirtualData 參予者 :
RealData 參予者 :
Future 參予者 :
範例程式 :
Future Pattern UML 類圖 :
* Main 類 :
Main 類會調用 Host 的 request 方法來獲取 Data, 之後接著呼叫Data 的 getContent 來顯示 Data 內容. 代碼如下 :
- package dp.thread.ch9;
- public class Main {
- public static void main(String args[]) {
- System.out.println("Main Begin");
- Host host = new Host();
- IData data1 = host.request(10, 'A');
- IData data2 = host.request(20, 'B');
- IData 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");;
- }
- }
Host 類會提供request 方法來產出 Data. 一開始會先建立 FutureData 的物件並回傳. 而後接著開啟線程進行 RealData 的製作並將之傳入 FutureData中. 代碼如下 :
- package dp.thread.ch9;
- public class Host {
- public IData 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;
- }
- }
IData 接口是用來表現數據的訪問方式的接口. FutureData 與 RealData 都實現這個接口. 代碼如下 :
- package dp.thread.ch9;
- public interface IData {
- public abstract String getContent();
- }
FutureData類在Future Pattern 代表 "提貨單". 代碼如下 :
- package dp.thread.ch9;
- public class FutureData implements IData{
- 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 dp.thread.ch9;
- public class RealData implements IData{
- private final String content;
- public RealData(int count, char c) {
- System.out.println(" Making ReadData("+count+","+c+")BEGIN");
- char[] buffer = new char[count];
- for(int i=0;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;
- }
- }
執行結果 :
補充說明 :
@. 能夠提升throughput 嗎 :
@. 變形 – 不讓人等待的 Future參予者 :
This message was edited 3 times. Last update was at 13/01/2010 11:57:53
置頂的MongoDB打成MangoDB了 XD
回覆刪除感謝提醒!!!
刪除