ホームページ >Java >&#&チュートリアル >Java 並列プログラミングで Fork/Join フレームワークを使用するためのガイド

Java 並列プログラミングで Fork/Join フレームワークを使用するためのガイド

WBOY
WBOYオリジナル
2024-04-19 08:51:01703ブラウズ

Java Fork/Join Framework Guide: Fork/Join タスクの作成: RecursiveAction (戻り値なし) または RecursiveTask (戻り値あり) クラス拡張機能を使用して、compute メソッドを実装します。 Fork/Join プールを作成する: ForkJoinPool を使用してスレッドの数を指定します。タスクを送信する: fork() を使用してタスクを送信し、join() を使用して結果を待ちます。タスクを分解します。compute メソッドで fork() および join() を呼び出してタスクを分解します。実際のケース (クイック ソート): QuickSortTask タスクを作成し、実行のために ForkJoinPool に送信します。

Java并行编程中 Fork/Join 框架的使用指南

Java 並列プログラミングでの Fork/Join フレームワークの使用に関するガイドライン

Fork/Join フレームワークは Java 並列プログラミングで使用されます。プログラミング モデル タスク並列化のための高度なメソッド。分割統治戦略を採用し、タスクをサブタスクに分解し、それらを並行して実行し、最後に結果をマージします。このガイドでは、Fork/Join フレームワークの使用方法を紹介し、実際のケースを通じてそれを実証します。

フォーク/結合タスクの作成

フォーク/結合フレームワークの基礎は、RecursiveAction クラスと RecursiveTask クラスです。

  • RecursiveAction 戻り値のないタスクに使用されます。
  • RecursiveTask 戻り値のあるタスクの場合。

タスクを作成するには、これら 2 つのクラスを拡張し、compute メソッドを実装する必要があります。 compute メソッドはタスクを実行するためのコードです。

フォーク/結合プールの作成

フォーク/結合フレームワークは、ForkJoinPool オブジェクトを使用してタスクの実行を管理します。タスクのスケジュールと実行に使用されるスレッド プールです。プールを作成するときに、スレッドの数を指定できます。

ForkJoinPool pool = new ForkJoinPool(Runtime.getRuntime().availableProcessors());

タスクの送信

タスクを送信するには、fork() メソッドと join() メソッドを使用します。 fork() メソッドはタスクをプールに送信し、join() メソッドはタスクが完了するのを待って結果を返します (RecursiveTask タスクの場合) )。

pool.fork(task);
long result = pool.join();

タスクの分解

大きなタスクの場合は、小さなサブタスクに分割できます。これを行うには、fork() メソッドと join() メソッドを compute メソッド内で呼び出すことができます。

@Override
protected void compute() {
  if (problem.isTooBig()) {
    ForkJoinTask leftTask = new LeftTask(leftHalf);
    ForkJoinTask rightTask = new RightTask(rightHalf);
    leftTask.fork();
    rightTask.fork();
    leftTask.join();
    rightTask.join();
  } else {
    // solve the problem directly
  }
}

実用的なケース: クイック ソート

次は、Fork/Join フレームワークを使用したクイック ソート アルゴリズムの例です。このアルゴリズムでは、

QuickSortTask

オブジェクトを作成し、ForkJoinPool に送信してください: <pre class='brush:java;toolbar:false;'>public class QuickSortTask extends RecursiveTask&lt;long[]&gt; { private int[] array; private int low; private int high; public QuickSortTask(int[] array, int low, int high) { this.array = array; this.low = low; this.high = high; } @Override protected long[] compute() { if (low &lt; high) { int pivot = partition(array, low, high); ForkJoinTask leftTask = new QuickSortTask(array, low, pivot - 1); ForkJoinTask rightTask = new QuickSortTask(array, pivot + 1, high); leftTask.fork(); rightTask.fork(); leftTask.join(); rightTask.join(); } return array; } private int partition(int[] array, int low, int high) { // ... } }</pre>

結論

フォーク/結合フレームワークは、Java でタスクを並列化するためのシンプルかつ簡単な方法を提供します。分割統治戦略を通じて、大規模なタスクを効率的に分割し、並行して実行できます。並列タスクは、

RecursiveAction

クラスと RecursiveTask クラス、および ForkJoinPool を使用することで簡単に作成および管理できます。

以上がJava 並列プログラミングで Fork/Join フレームワークを使用するためのガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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