Callable与Future的介绍
| ? ? Callable與 Future?兩功能是Java在后續版本中為了適應多并法才加入的,Callable是類似于Runnable的接口,實現Callable接口的類和實現Runnable的類都是可被其他線程執行的任務。 Callable的接口定義如下; public interface Callable<V> {? ? ? ? V ? call() ? throws Exception;? }? Callable和Runnable的區別如下: I ?? Callable定義的方法是call,而Runnable定義的方法是run。 II ? Callable的call方法可以有返回值,而Runnable的run方法不能有返回值。 III ?Callable的call方法可拋出異常,而Runnable的run方法不能拋出異常。 ? Future 介紹 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 { ? ? public static class? MyCallable ?implements Callable{ ? ? ? ? ? private int flag = 0;?
? ? ? ? ? public MyCallable(int flag){ ? ? ? ? ? ? ? ? ? this.flag = flag; ? ? ? ? ? } ? ? ? ? ??public String call() throws Exception{ ? ? ? ? ? ? ??if (this.flag == 0){ ?
? ? ? ? ? ? ? ? ? ? ? return "flag = 0"; ? ? ? ? ? ? }? ? ? ? ? ? ? if (this.flag == 1){ ??
? ? ? ? ? ? ? ? try { ? ? ? ? ? ? ? ? ? ? while (true) { ? ? ? ? ? ? ? ? ? ? ? ? ? ??System.out.println("looping."); ? ? ? ? ? ? ? ? ? ? ? ? ? ? Thread.sleep(2000); ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? } catch (InterruptedException e) { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? System.out.println("Interrupted"); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? return "false"; ? ? ? ? ? ? } else { ??
? ? ? ? ? ? ? ? ? ? ? ?throw new Exception("Bad flag value!"); ? ? ? ? ? ? } ? ? ? ? } ? ? } ? ? public static void main(String[] args) { ? ? ? ?// 定義3個Callable類型的任務 ? ? ? ? MyCallable task1 = new MyCallable(0); ? ? ? ? MyCallable task2 = new MyCallable(1); ? ? ? ? MyCallable task3 = new MyCallable(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(); ? ? } } |
轉載于:https://www.cnblogs.com/whgw/archive/2011/09/28/2194760.html
總結
以上是生活随笔為你收集整理的Callable与Future的介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 武汉大学新发现:与排便有关 世界“第一杀
- 下一篇: 使用URI设计松散耦合的Metro应用程