FutureTask 與Callable:Java 並發中的差異
在Java 並發程式設計中,FutureTask
# 和 Callable
扮演著重要的角色,它們之間的差異在於:
Callable
Runnable
,但有回傳值。 call()
方法,傳回任務的結果。 FutureTask
Future
接口,表示正在執行或已完成的非同步任務。 Callable
對象,用來管理任務執行的細節。 get()
)並檢查任務是否完成(isDone()
)。 區別
#特徵 | Callable | FutureTask |
---|---|---|
傳回值 | 無回傳值 | 返回任務結果 |
多重結果支援 | 不支援 | 支援多個FutureTask 代表相同Callable
|
取消任務 | 不支援 | 支援透過呼叫cancel() 取消任務 |
異常處理 |
call() 方法中處理 |
FutureTask 提供get() 方法來處理異常 |
# #實戰案例
假設我們有一個簡單任務,計算斐波那契數列的第一個n 個元素。Callable 實作:
import java.util.concurrent.Callable; public class FibonacciCallable implements Callable<Integer[]> { private int n; public FibonacciCallable(int n) { this.n = n; } @Override public Integer[] call() { Integer[] fibSequence = new Integer[n]; fibSequence[0] = 0; fibSequence[1] = 1; for (int i = 2; i < n; i++) { fibSequence[i] = fibSequence[i - 1] + fibSequence[i - 2]; } return fibSequence; } }
FutureTask 實作:
import java.util.concurrent.FutureTask; import java.util.concurrent.ExecutionException; public class FibonacciFutureTask { public static void main(String[] args) { int n = 10; FibonacciCallable callable = new FibonacciCallable(n); FutureTask<Integer[]> futureTask = new FutureTask<>(callable); new Thread(futureTask).start(); Integer[] fibSequence; try { fibSequence = futureTask.get(); // 等待任务完成并获取结果 } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } System.out.println("Fibonacci sequence upto " + n + " elements:"); for (Integer fib : fibSequence) { System.out.print(fib + " "); } } }在此範例中,我們使用
Callable 來定義任務,使用
FutureTask 來管理任務執行。透過呼叫
get() 方法,我們可以在任務完成後取得斐波那契數列。
以上是Java函數的並發和多執行緒中的FutureTask和Callable差異是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!