Cyh的博客

          Email:kissyan4916@163.com
          posts - 26, comments - 19, trackbacks - 0, articles - 220

          線程--Callable和Future

          Posted on 2009-12-21 21:16 啥都寫點 閱讀(1266) 評論(0)  編輯  收藏 所屬分類: J2SE
                 Callable是類似于Runnable的接口,實現Callable接口的類和實現Runnable的類都是可被其他線程執行的任務。
                 Callable和Runnable的區別如下:

                         Callable定義的方法是call,而Runnable定義的方法是run。
                         Callable的call方法可以有返回值,而Runnable的run方法不能有返回值。
                         Callable的call方法可拋出異常,而Runnable的run方法不能拋出異常。    
                 Future表示異步計算的結果,它提供了檢查計算是否完成的方法,以等待計算的完成,并檢索計算的結果。Future的cancel方法取消任務的執行,有一個布爾參數,參數為true表示立即中斷任務的執行,參數為false表示允許正在運行的任務運行完成。Future的get方法等待計算完成,獲取計算結果。
           


          import java.util.concurrent.Callable;
          import java.util.concurrent.ExecutorService;
          import java.util.concurrent.Executors;
          import java.util.concurrent.Future;

          /**
           * Callable 和 Future接口
           * Callable是類似于Runnable的接口,實現Callable接口的類和實現Runnable的類都是可被其它線程執行的任務。
           * Callable和Runnable有幾點不同:
           * (1)Callable規定的方法是call(),而Runnable規定的方法是run().
           * (2)Callable的任務執行后可返回值,而Runnable的任務是不能返回值的。
           * (3)call()方法可拋出異常,而run()方法是不能拋出異常的。
           * (4)運行Callable任務可拿到一個Future對象,
           * Future 表示異步計算的結果。它提供了檢查計算是否完成的方法,以等待計算的完成,并檢索計算的結果。
           * 通過Future對象可了解任務執行情況,可取消任務的執行,還可獲取任務執行的結果。
           
          */

          public class CallableAndFuture {

              
          /**
               * 自定義一個任務類,實現Callable接口
               
          */

              
          public static class MyCallableClass implements Callable{
                  
          // 標志位
                  private int flag = 0;
                  
          public MyCallableClass(int flag){
                      
          this.flag = flag;
                  }

                  
          public String call() throws Exception{
                      
          if (this.flag == 0){
                          
          // 如果flag的值為0,則立即返回
                          return "flag = 0";
                      }
           
                      
          if (this.flag == 1){
                          
          // 如果flag的值為1,做一個無限循環
                          try {
                              
          while (true{
                                  System.out.println(
          "looping.");
                                  Thread.sleep(
          2000);
                              }

                          }
           catch (InterruptedException e) {
                              System.out.println(
          "Interrupted");
                          }

                          
          return "false";
                      }
           else {
                          
          // falg不為0或者1,則拋出異常
                          throw new Exception("Bad flag value!");
                      }

                  }

              }

              
              
          public static void main(String[] args) {
                  
          // 定義3個Callable類型的任務
                  MyCallableClass task1 = new MyCallableClass(0);
                  MyCallableClass task2 
          = new MyCallableClass(1);
                  MyCallableClass task3 
          = new MyCallableClass(2);
                  
                  
          // 創建一個執行任務的服務
                  ExecutorService es = Executors.newFixedThreadPool(3);
                  
          try {
                      
          // 提交并執行任務,任務啟動時返回了一個Future對象,
                      
          // 如果想得到任務執行的結果或者是異常可對這個Future對象進行操作
                      Future future1 = es.submit(task1);
                      
          // 獲得第一個任務的結果,如果調用get方法,當前線程會等待任務執行完畢后才往下執行
                      System.out.println("task1: " + future1.get());
                      
                      Future future2 
          = es.submit(task2);
                      
          // 等待5秒后,再停止第二個任務。因為第二個任務進行的是無限循環
                      Thread.sleep(5000);
                      System.out.println(
          "task2 cancel: " + future2.cancel(true));
                      
                      
          // 獲取第三個任務的輸出,因為執行第三個任務會引起異常
                      
          // 所以下面的語句將引起異常的拋出
                      Future future3 = es.submit(task3);
                      System.out.println(
          "task3: " + future3.get());
                  }
           catch (Exception e){
                      System.out.println(e.toString());
                  }

                  
          // 停止任務執行服務
                  es.shutdownNow();
              }

          }



                                                                                                                 --    學海無涯
                  

          主站蜘蛛池模板: 新龙县| 海阳市| 乡城县| 昭平县| 海口市| 方城县| 通河县| 阜新| 安宁市| 新余市| 思南县| 吉林省| 墨竹工卡县| 丽江市| 四子王旗| 和硕县| 商水县| 当雄县| 达日县| 根河市| 遂平县| 太康县| 建瓯市| 随州市| 洞头县| 金湖县| 呼伦贝尔市| 达尔| 乌鲁木齐市| 阿克| 白朗县| 志丹县| 淮滨县| 新沂市| 浪卡子县| 阳东县| 军事| 通山县| 台南县| 茶陵县| 玛纳斯县|