Fork/Join フレームワークは、Java 7 で導入された java.util.concurrent パッケージの一部です。これは、各チャンクを処理できる小さなチャンクに再帰的に分割できるタスク用に設計されています。独立して。このフレームワークは分割統治の原理に基づいて動作するため、並べ替え、検索、その他の再帰的アルゴリズムなどのタスクに最適です。
ForkJoinTask は、Fork/Join フレームワーク内で実行できるタスクの基本クラスです。これは、タスクが新しいサブタスクをフォークし、完了後にそれらを結合できるようにするコア操作を提供します。
例:
import java.util.concurrent.RecursiveTask; public class SumTask extends RecursiveTask<Integer> { private final int[] arr; private final int start, end; public SumTask(int[] arr, int start, int end) { this.arr = arr; this.start = start; this.end = end; } @Override protected Integer compute() { if (end - start <= 10) { int sum = 0; for (int i = start; i < end; i++) { sum += arr[i]; } return sum; } else { int mid = (start + end) / 2; SumTask leftTask = new SumTask(arr, start, mid); SumTask rightTask = new SumTask(arr, mid, end); leftTask.fork(); int rightResult = rightTask.compute(); int leftResult = leftTask.join(); return leftResult + rightResult; } } }
ForkJoinPool は、ForkJoinTask インスタンスを実行するワーカー スレッドのプールを管理する中心クラスです。ワークスチールアルゴリズムを使用して、ビジーなスレッドからアイドル状態のスレッドにタスクを再分配することで、すべてのスレッドをビジー状態に保ちます。
例:
import java.util.concurrent.ForkJoinPool; public class ForkJoinExample { public static void main(String[] args) { int[] arr = new int[100]; for (int i = 0; i < arr.length; i++) { arr[i] = i + 1; } ForkJoinPool pool = new ForkJoinPool(); SumTask task = new SumTask(arr, 0, arr.length); int result = pool.invoke(task); System.out.println("Sum: " + result); } }
RecursiveTask はタスクが結果を返す場合に使用され、RecursiveAction は結果を返さない場合に使用されます。
RecursiveAction を使用した例:
import java.util.concurrent.RecursiveAction; public class PrintTask extends RecursiveAction { private final int[] arr; private final int start, end; public PrintTask(int[] arr, int start, int end) { this.arr = arr; this.start = start; this.end = end; } @Override protected void compute() { if (end - start <= 10) { for (int i = start; i < end; i++) { System.out.print(arr[i] + " "); } System.out.println(); } else { int mid = (start + end) / 2; PrintTask leftTask = new PrintTask(arr, start, mid); PrintTask rightTask = new PrintTask(arr, mid, end); invokeAll(leftTask, rightTask); } } }
ForkJoinExample を実行すると、配列要素の合計が出力されます。 Fork/Join フレームワークは、タスクを小さなチャンクに分割して並列処理するため、特に大規模なデータセットの場合に大幅なパフォーマンスの向上が見られます。
たとえば、1 から 100 までの数字を合計すると次のようになります。
Sum: 5050
PrintTask の場合、フレームワークは配列印刷タスクを分割し、並列実行してセグメントを同時に出力します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ...
Fork/Join フレームワークは、並列処理タスクを最適化するための Java の強力なツールです。タスクを小さなサブタスクに分割し、個別に実行し、結合して最終結果を生成できるシナリオに優れています。複雑さが伴いますが、マルチコア環境ではパフォーマンス上の利点が欠点を上回ることが多いため、CPU に依存した大規模な再帰的問題には優れた選択肢となります。
詳細については、 で投稿をご覧ください: Java の Fork/Join Framework とは何ですか?
以上がJava の Fork/Join フレームワークとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。