<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                出自[Java多線程編程中Future模式的詳解](http://blog.csdn.net/ghuil/article/details/41048017) [TOC=1,2] [Java](http://lib.csdn.net/base/javase "Java SE知識庫")多線程編程中,常用的多線程設計模式包括:Future模式、Master-Worker模式、Guarded Suspeionsion模式、不變模式和生產者-消費者模式等。這篇文章主要講述Future模式,關于其他多線程設計模式的地址如下: 關于其他多線程設計模式的地址如下: 關于Master-Worker模式的詳解:[?Java多線程編程中Master-Worker模式的詳解](http://blog.csdn.net/ghuil/article/details/41048005) 關于Guarded Suspeionsion模式的詳解:[?Java多線程編程中Guarded Suspeionsion模式的詳解](http://blog.csdn.net/ghuil/article/details/41047999) 關于不變模式的詳解:[?Java多線程編程中不變模式的詳解](http://blog.csdn.net/ghuil/article/details/41047979) 關于生產者-消費者模式的詳解:[生產者-消費者模式Java詳解](http://blog.csdn.net/ghuil/article/details/41044257) # 1\. Future模式核心思想 Future模式的核心在于:去除了主函數的等待時間,并使得原本需要等待的時間段可以用于處理其他業務邏輯(根據《Java程序性能優化》)。 Future模式有點類似于商品訂單。在網上購物時,提交訂單后,在收貨的這段時間里無需一直在家里等候,可以先干別的事情。類推到程序設計中時,當提交請求時,期望得到答復時,如果這個答復可能很慢。傳統的時一直等待到這個答復收到時再去做別的事情,但如果利用Future設計模式就無需等待答復的到來,在等待答復的過程中可以干其他事情。 例如如下的請求調用過程時序圖。當call請求發出時,需要很長的時間才能返回。左邊的圖需要一直等待,等返回數據后才能繼續其他操作;而右邊的Future模式的圖中客戶端則無需等到可以做其他的事情。服務器段接收到請求后立即返回結果給客戶端,這個結果并不是真實的結果(是虛擬的結果),也就是先獲得一個假數據,然后執行其他操作。 ![](http://img.blog.csdn.net/20141112192253656) # 2\. Future模式Java實現 **Client的實現** Client主要完成的功能包括:1\. 返回一個FutureData;2.開啟一個線程用于構造RealData。** ** **[cpp]**?[view plain](http://blog.csdn.net/ghuil/article/details/41048017# "view plain")?[copy](http://blog.csdn.net/ghuil/article/details/41048017# "copy") 1. public?class?Client?{?? 2. ????public?Data?request(final?String?string)?{?? 3. ????????final?FutureData?futureData?=?new?FutureData();?? 4. ?????????? 5. ????????new?Thread(new?Runnable()?{?? 6. ????????????@Override?? 7. ????????????public?void?run()?{?? 8. ????????????????//RealData的構建很慢,所以放在單獨的線程中運行?? 9. ????????????????RealData?realData?=?new?RealData(string);?? 10. ????????????????futureData.setRealData(realData);?? 11. ????????????}?? 12. ????????}).start();?? 13. ?????????? 14. ????????return?futureData;?//先直接返回FutureData?? 15. ????}?? 16. }?? **Data的實現** 無論是FutureData還是RealData都實現該接口。** ** **[java]**?[view plain](http://blog.csdn.net/ghuil/article/details/41048017# "view plain")?[copy](http://blog.csdn.net/ghuil/article/details/41048017# "copy") 1. public?interface?Data?{?? 2. ????String?getResult()?throws?InterruptedException;?? 3. }?? **FutureData的實現** FutureData是Future模式的關鍵,它實際上是真實數據RealData的代理,封裝了獲取RealData的等待過程。 **[java]**?[view plain](http://blog.csdn.net/ghuil/article/details/41048017# "view plain")?[copy](http://blog.csdn.net/ghuil/article/details/41048017# "copy") 1. //FutureData是Future模式的關鍵,它實際上是真實數據RealData的代理,封裝了獲取RealData的等待過程?? 2. public?class?FutureData?implements?Data?{?? 3. ????RealData?realData?=?null;?//FutureData是RealData的封裝?? 4. ????boolean?isReady?=?false;??//是否已經準備好?? 5. ?????? 6. ????public?synchronized?void?setRealData(RealData?realData)?{?? 7. ????????if(isReady)?? 8. ????????????return;?? 9. ????????this.realData?=?realData;?? 10. ????????isReady?=?true;?? 11. ????????notifyAll();?//RealData已經被注入到FutureData中了,通知getResult()方法?? 12. ????}?? 13. ?? 14. ????@Override?? 15. ????public?synchronized?String?getResult()?throws?InterruptedException?{?? 16. ????????if(!isReady)?{?? 17. ????????????wait();?//一直等到RealData注入到FutureData中?? 18. ????????}?? 19. ????????return?realData.getResult();??? 20. ????}?? 21. }?? **RealData的實現** RealData是最終需要使用的數據,它的構造函數很慢。 **[java]**?[view plain](http://blog.csdn.net/ghuil/article/details/41048017# "view plain")?[copy](http://blog.csdn.net/ghuil/article/details/41048017# "copy") 1. public?class?RealData?implements?Data?{?? 2. ????protected?String?data;?? 3. ?? 4. ????public?RealData(String?data)?{?? 5. ????????//利用sleep方法來表示RealData構造過程是非常緩慢的?? 6. ????????try?{?? 7. ????????????Thread.sleep(1000);?? 8. ????????}?catch?(InterruptedException?e)?{?? 9. ????????????e.printStackTrace();?? 10. ????????}?? 11. ????????this.data?=?data;?? 12. ????}?? 13. ?? 14. ????@Override?? 15. ????public?String?getResult()?{?? 16. ????????return?data;?? 17. ????}?? 18. }?? **測試運行** 主函數主要負責調用Client發起請求,并使用返回的數據。 **[java]**?[view plain](http://blog.csdn.net/ghuil/article/details/41048017# "view plain")?[copy](http://blog.csdn.net/ghuil/article/details/41048017# "copy") 1. public?class?Application?{?? 2. ????public?static?void?main(String[]?args)?throws?InterruptedException?{?? 3. ????????Client?client?=?new?Client();?? 4. ????????//這里會立即返回,因為獲取的是FutureData,而非RealData?? 5. ????????Data?data?=?client.request("name");?? 6. ????????//這里可以用一個sleep代替對其他業務邏輯的處理?? 7. ????????//在處理這些業務邏輯過程中,RealData也正在創建,從而充分了利用等待時間?? 8. ????????Thread.sleep(2000);?? 9. ????????//使用真實數據?? 10. ????????System.out.println("數據="+data.getResult());?? 11. ????}?? 12. }?? # 3\. Future模式的JDK內置實現 由于Future是非常常用的多線程設計模式,因此在JDK中內置了Future模式的實現。這些類在java.util.concurrent包里面。其中最為重要的是FutureTask類,它實現了Runnable接口,作為單獨的線程運行。在其run()方法中,通過Sync內部類調用Callable接口,并維護Callable接口的返回對象。當使用FutureTask.get()方法時,將返回Callable接口的返回對象。同樣,針對上述的實例,如果使用JDK自帶的實現,則需要作如下調整。 首先,Data接口和FutureData就不需要了,JDK幫我們實現了。 其次,RealData改為這樣: **[java]**?[view plain](http://blog.csdn.net/ghuil/article/details/41048017# "view plain")?[copy](http://blog.csdn.net/ghuil/article/details/41048017# "copy") 1. import?java.util.concurrent.Callable;?? 2. ?? 3. public?class?RealData?implements?Callable?{?? 4. ????protected?String?data;?? 5. ?? 6. ????public?RealData(String?data)?{?? 7. ????????this.data?=?data;?? 8. ????}?? 9. ?? 10. ????@Override?? 11. ????public?String?call()?throws?Exception?{?? 12. ????????//利用sleep方法來表示真是業務是非常緩慢的?? 13. ????????try?{?? 14. ????????????Thread.sleep(1000);?? 15. ????????}?catch?(InterruptedException?e)?{?? 16. ????????????e.printStackTrace();?? 17. ????????}?? 18. ????????return?data;?? 19. ????}?? 20. }?? 最后,在測試運行時,這樣調用: **[java]**?[view plain](http://blog.csdn.net/ghuil/article/details/41048017# "view plain")?[copy](http://blog.csdn.net/ghuil/article/details/41048017# "copy") 1. import?java.util.concurrent.ExecutorService;?? 2. import?java.util.concurrent.Executors;?? 3. import?java.util.concurrent.FutureTask;?? 4. ?? 5. public?class?Application?{?? 6. ????public?static?void?main(String[]?args)?throws?Exception?{?? 7. ????????FutureTask?futureTask?=??? 8. ????????????????new?FutureTask(new?RealData("name"));?? 9. ????????ExecutorService?executor?=??? 10. ????????????????Executors.newFixedThreadPool(1);?//使用線程池?? 11. ????????//執行FutureTask,相當于上例中的client.request("name")發送請求?? 12. ????????executor.submit(futureTask);?? 13. ????????//這里可以用一個sleep代替對其他業務邏輯的處理?? 14. ????????//在處理這些業務邏輯過程中,RealData也正在創建,從而充分了利用等待時間?? 15. ????????Thread.sleep(2000);?? 16. ????????//使用真實數據?? 17. ????????//如果call()沒有執行完成依然會等待?? 18. ????????System.out.println("數據="?+?futureTask.get());?? 19. ????}?? 20. }?? 本文完。轉載請注明出處。 參考文獻 葛一鳴,Java程序性能優化.清華大學出版社.
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看