javaEye轉載(java多線程 Callable 的實現),里面涉及到ExecutorService

chyx413332087 13年前發布 | 4K 次閱讀

<DIV class=bar>

<DIV class=tools>Java代碼 <A title=復制代碼 href="/misc/goto?guid=5033827619330020129"><IMG alt=復制代碼 src="</A> <A title=收藏這段代碼 href="/misc/goto?guid=5033824541631065302"><IMG class=star alt=收藏代碼 src="<IMG style="DISPLAY: none" class=spinner src="</A></DIV></DIV>

<OL class=dp-j>

  • 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();      
  •     }      
  • }    
  • </OL>

     本文由用戶 chyx413332087 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
     轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
     本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!