ホームページ  >  記事  >  Java  >  Java 並列プログラミングでの ExecutorService と FutureTask の使用

Java 並列プログラミングでの ExecutorService と FutureTask の使用

WBOY
WBOYオリジナル
2024-04-18 09:36:021138ブラウズ

ExecutorService を使用してスレッド プールを管理し、タスクを実行し、FutureTask を使用してタスクを非同期に実行し、その結果を取得します。 ExecutorService は、execute() や submit() などのメソッドを提供し、FutureTask は get()、isDone()、および cancel() メソッドを提供します。実際の例では、これらを使用してフィボナッチ数列の数値を並列計算する方法を示します。

Java 並列プログラミングでの ExecutorService と FutureTask の使用

Java 並列プログラミングにおける ExecutorService と FutureTask の使用

はじめに

ExecutorService と FutureTask は、Java での並列プログラミングに便利なツールです。 ExecutorService を使用すると一連のスレッドを管理でき、FutureTask を使用するとタスクを非同期に実行し、その結果を取得できます。

ExecutorService

ExecutorService は、実行可能なスレッド タスクのコレクションを表すインターフェイスです。以下を使用して ExecutorService のさまざまな実装を作成できます。

ExecutorService executorService = Executors.newFixedThreadPool(5);

ここで、5 はスレッド プール内のスレッドの数を表します。

ExecutorService は、タスクを実行するための次のメソッドを提供します。

  • execute(Runnable task): 実行可能なタスクを実行します。
  • submit(実行可能タスク): 実行可能タスクを実行し、値を返します。
  • submit(Callable<t> task)</t>: Callable タスクを実行し、値を返します。

FutureTask

FutureTask は、タスクを非同期に実行し、後でその結果を取得できるようにする呼び出し可能タスクのラッパーです。次のメソッドを使用して FutureTask を作成できます:

FutureTask<String> futureTask = new FutureTask<>(() -> "Hello, world!");

ここで () -> "Hello, world!" は実行される呼び出し可能タスクです。

FutureTask には、タスクの結果を取得するための次のメソッドが用意されています。

  • get(): タスクの完了を待機するブロックと結果を返します。
  • isDone(): タスクが完了したかどうかを確認します。
  • cancel(boolean MayInterruptIfRunning): タスクをキャンセルします (可能な場合)。

実践例

フィボナッチ数列を計算するプログラムを考えてみましょう。 ExecutorService と FutureTask を使用して、複数のフィボナッチ数を並行して計算できます。

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;

class FibonacciTask implements Callable<Long> {

    private int n;

    public FibonacciTask(int n) {
        this.n = n;
    }

    @Override
    public Long call() {
        long a = 0;
        long b = 1;
        for (int i = 0; i < n; i++) {
            long temp = a;
            a = b;
            b = temp + b;
        }
        return a;
    }
}

public class Main {

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(4);
        FutureTask<Long>[] tasks = new FutureTask[10];

        // 创建并提交任务
        for (int i = 0; i < 10; i++) {
            tasks[i] = new FutureTask<>(new FibonacciTask(i));
            executorService.submit(tasks[i]);
        }

        // 获取并打印结果
        for (int i = 0; i < 10; i++) {
            try {
                System.out.println("斐波那契数列第 " + i + " 项:" + tasks[i].get());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        // 关闭 ExecutorService
        executorService.shutdown();
    }
}

この例では、ExecutorService を作成し、10 個の FibonacciTask タスクを送信しました。各タスクはフィボナッチ数列の数値を計算します。 FutureTask を使用すると、これらのタスクを非同期で実行し、後で結果を取得できます。

以上がJava 並列プログラミングでの ExecutorService と FutureTask の使用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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