碼農往事
          我的代碼為什么這么丑?一定是因為我長的不好看
          posts - 29,comments - 86,trackbacks - 0
          并發模式中,有一個稱做Future模式。啥是Future模式捏? future,翻譯成中文就是“未來,將來”的意思,可以簡單地理解為 “明天的事明天再做” 。
          比方說,你在做晚飯,而只有一個火爐,先燉個豬蹄要1小時,在等待豬蹄的這個時間里,你可以去淘米、洗菜、刷牙、摳腳,待豬蹄燉好了,再繼續炒菜。
          在編碼中體現為:將耗時任務丟入單獨的線程,從而使主線程能夠繼續執行其它的邏輯,待耗時任務執行完成后再做相應的處理。
          Future模式是一鐘十分常用的并發模式,所以JDK的并發包中自帶一套實現。上類圖:



          這個自己畫的,既然畫了不能白畫,囧?。。?br />
          下面這個是用 IntelliJ IDEA 自帶工具生成的,真心太酸爽。


          只看函數名稱,也能基本了解FutureTask所提供的主要能力:
          1、可判斷執行狀態(isDone())
          2、可取消(cancel())
          3、可讀取返回結果(get())
          4、可判斷是否取消(isCancelled)
          現在,我們可以解決上面這個豬腳的問題了:

              public static class TestTask implements Callable<Boolean> {
                  @Override
                  public Boolean call() throws Exception {
                      //模擬時間消耗
                      System.out.println("--------漫長的一小時--------");
                      Thread.sleep(10000);
                      System.out.println("--------豬腳燉完--------");
                      return true;
                  }
              }

              public static void main(String[] args) throws ExecutionException, InterruptedException {

                  System.out.println("--------開始做晚飯--------");
                  System.out.println("開始燉豬腳~~~");
                  System.out.println("--------豬腳下鍋--------");
                  FutureTask<Boolean> futureTask = new FutureTask<Boolean>(new TestTask());
                  Thread thread = new Thread(futureTask);
                  thread.start();
                  Thread.sleep(1000);
                  System.out.println("--------淘米--------");
                  Thread.sleep(1000);
                  System.out.println("--------洗菜--------");
                  Thread.sleep(1000);
                  System.out.println("--------刷牙--------");
                  Thread.sleep(1000);
                  System.out.println("--------摳腳--------");
                  //如果豬腳燉好了
                  if(futureTask.get()==true){
                      System.out.println("--------繼續炒菜--------");
                  }
              }
          執行結果:
          --------開始做晚飯--------
          開始燉豬腳~~~
          --------豬腳下鍋--------
          --------漫長的一小時--------
          --------淘米--------
          --------洗菜--------
          --------刷牙--------
          --------摳腳--------
          --------豬腳燉完--------
          --------繼續炒菜--------
          posted on 2014-10-23 16:13 Jimi 閱讀(5270) 評論(3)  編輯  收藏

          FeedBack:
          # re: java并發學習—— FutrueTask的使用示例
          2014-10-23 23:15 | 王鐸開
          LZ請原諒我的無知,這不就是按順序執行嗎?  回復  更多評論
            
          # re: java并發學習—— FutrueTask的使用示例
          2014-10-24 00:05 | Jimi
          @王鐸開
          你看看豬腳下鍋到出鍋,你已經淘完米、洗完菜、刷完牙、摳完腳了  回復  更多評論
            
          # re: java并發學習與實踐—— FutrueTask的使用示例
          2014-11-17 16:52 | 閔涼宇
          不是吧,后面幾個邏輯和燉豬腳是同時執行的吧。。@王鐸開
            回復  更多評論
            

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 凌海市| 桐柏县| 民勤县| 夹江县| 灵武市| 柞水县| 伊吾县| 温宿县| 竹山县| 东辽县| 怀柔区| 定日县| 洪湖市| 二连浩特市| 瓦房店市| 榆中县| 阿城市| 个旧市| 永修县| 临夏县| 竹山县| 习水县| 高陵县| 邢台县| 闵行区| 萨嘎县| 荃湾区| 凉城县| 唐河县| 利津县| 通城县| 通山县| 潜山县| 铜山县| 山西省| 敖汉旗| 深水埗区| 大新县| 靖江市| 浑源县| 昭平县|