Java Fork/Join Framework Guide: Fork/Join タスクの作成: RecursiveAction (戻り値なし) または RecursiveTask (戻り値あり) クラス拡張機能を使用して、compute メソッドを実装します。 Fork/Join プールを作成する: ForkJoinPool を使用してスレッドの数を指定します。タスクを送信する: fork() を使用してタスクを送信し、join() を使用して結果を待ちます。タスクを分解します。compute メソッドで fork() および join() を呼び出してタスクを分解します。実際のケース (クイック ソート): QuickSortTask タスクを作成し、実行のために ForkJoinPool に送信します。
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<long[]> {
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 < 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 サイトの他の関連記事を参照してください。