一 Future Patternjava
假若有一個執行起來須要花費一些時間的方法,爲了省去沒必要要的等待執行結果出來,繼續作別的事情,則能夠事先獲取一個「提貨單」即Future參與者,Future Pattern模式也就是這樣的方式,當一個線程須要另外一個線程的處理的結果時候,則沒必要一直等着處理結果,能夠先處理別的事情,提早拿個Future對象,再過一段時間來獲取另外一個線程的處理結果。ide
在多個線程中,返回另外一個線程的執行結果,最簡單的就是採用主線程調用子線程後,一直無限循環等待子線程處理結果。因爲這種會浪費等待的時間,且會浪費CPU,在此基礎上,進而在子線程中調用主線程的方法來實現。能夠利用靜態方法和實例方法,在利用實例方法中就須要在調用子線程的時候經過構造器將主線程對象的實例傳遞給子線程使用。可是這種方式還欠缺一些靈活性,主線程的方法是由子線程調用的,至於何時該方法被調用則不清楚,不利於主線程處理。this
爲了改變這種模式,則就利用Future Pattern,主線程調用子線程後,繼續執行程序,只是在調用子線程後,暫時獲取一個臨時對象Future,這樣在主線程想獲取Future內部數據的時候,就能夠調用Future的方法,若是該方法中已經有了處理結果,則此時就能夠馬上獲取,若是沒有則主線程就須要稍微等一下返回結果。這種方式的優勢就是主線程能夠任什麼時候候調用返回的結果,主線程沒必要長等待返回的結果。spa
Future Pattern的參與者線程
1 Client參與者,發送請求方,調用子線程的,它一旦發送請求後,就獲取一個VirtualData,做爲請求的結果。對象
2 Host參與者,接受請求者,會爲請求者返回一個FutureData對象。而且會啓動一個線程來執行真正的任務,最後將任務的返回結果RealData對象賦值給FutureData對象。接口
3 VirturalData參與者,用來統一表明FutureData參與者與RealData參與者,是他們的統一接口。get
4 FutureData參與者,它是當作工做尚未正式完成前的臨時表明,會在其中進行線程的等待,喚醒,以及提供Client參與者調用處理結果的方法。it
5 RealData參與者,具體真正進行操做數據的類。io
實例代碼:
主要是FutureData類和Host參與者以及Client參與者,ReaLData就是真正執行的任務沒寫。
Client參與者
package whut.future; public class FutureMain { public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("main BEGIN"); Host host=new Host(); Data data1=host.request(10, 'A'); Data data2=host.request(20, 'B'); 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("main END"); } }
Host參與者
package whut.future; public class Host { //使用Thread-Per-Messagee Pattern public Data request(final int count,final char c) { System.out.println(" request("+count+","+c+") BEGIN"); final FutureData future=new FutureData(); //啓動線程執行 new Thread() { public void run() { RealData realData=new RealData(count,c); future.setRealData(realData); } }.start(); System.out.println(" request("+count+","+c+") END"); return future; } }
FutureData參與者,這個是真正的關鍵部分
package whut.future; //核心部分 public class FutureData implements Data { private RealData realData = null; private boolean ready = false; public synchronized void setRealData(RealData realData) { if (ready) return;// 利用Balk Pattern來防止賦值屢次 this.realData = realData; this.ready = true; notifyAll(); } public synchronized String getContent() { // 運用了Guarded Suspension Pattern while (!ready) { try { wait(); } catch (InterruptedException e) { } } return realData.getContent(); } }