ホームページ  >  記事  >  Java  >  Java 関数の同時実行性とマルチスレッドにおける FutureTask と Callable の違いは何ですか?

Java 関数の同時実行性とマルチスレッドにおける FutureTask と Callable の違いは何ですか?

WBOY
WBOYオリジナル
2024-04-27 10:45:01462ブラウズ

Java 関数の同時実行性とマルチスレッドにおける FutureTask と Callable の違いは何ですか?

FutureTask と Callable: Java 同時実行性の違い

Java 同時プログラミングでは、FutureTaskCallable が重要な役割を果たし、それらの違い違いは次のとおりです: FutureTaskCallable 扮演着重要的角色,它们之间的区别在于:

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()

🎜Callable🎜🎜
  • 同時に実行できるタスクを表します。
  • Runnable に似ていますが、戻り値を持ちます。
  • call() メソッドは、タスクの結果を返すように定義されています。
🎜🎜FutureTask🎜🎜
  • 実行中または完了している非同期タスクを表す Future インターフェイスを実装します。
  • Callable オブジェクトをラップして、タスク実行の詳細を管理します。
  • タスクの結果を取得するメソッド (get()) と、タスクが完了したかどうかを確認するメソッド (isDone()) を提供します。
🎜🎜違い🎜🎜 例外処理
機能 呼び出し可能 FutureTask
戻り値 戻り値なし タスクの結果を返す
多結果のサポート サポートされません 同じ Callable を表す複数の FutureTask をサポートします
タスクのキャンセル サポートされていません cancel() の呼び出しによるタスクのキャンセルをサポートします
call() はメソッド FutureTaskget() メソッドは、例外の処理に提供されています。
🎜🎜実際のケース🎜🎜🎜 フィボナッチ数列の最初の n 要素を計算する単純なタスクがあるとします。 🎜🎜🎜呼び出し可能な実装: 🎜🎜rrreee🎜🎜FutureTask 実装: 🎜🎜rrreee🎜 この例では、Callable を使用してタスクを定義し、FutureTask を使用してタスクの実行を管理します。 。 get() メソッドを呼び出すことで、タスクの完了後にフィボナッチ数列を取得できます。 🎜

以上がJava 関数の同時実行性とマルチスレッドにおける FutureTask と Callable の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。