首頁 >Java >java教程 >Java函數的並發和多執行緒中的FutureTask和Callable差異是什麼?

Java函數的並發和多執行緒中的FutureTask和Callable差異是什麼?

WBOY
WBOY原創
2024-04-27 10:45:01474瀏覽

Java函數的並發和多執行緒中的FutureTask和Callable差異是什麼?

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn