Das Fork/Join Framework ist Teil des Paketsjava.util.concurrent, das in Java 7 eingeführt wurde. Es ist für Aufgaben konzipiert, die rekursiv in kleinere Blöcke unterteilt werden können, wobei jeder Block verarbeitet werden kann unabhängig. Das Framework funktioniert nach dem Prinzip „Teile und herrsche“ und eignet sich daher ideal für Aufgaben wie Sortieren, Suchen und andere rekursive Algorithmen.
ForkJoinTaskist die Basisklasse für Aufgaben, die innerhalb des Fork/Join Framework ausgeführt werden können. Es stellt die Kernoperationen bereit, die es Aufgaben ermöglichen, neue Unteraufgaben aufzuteilen und diese nach Abschluss zusammenzuführen.
Beispiel:
import java.util.concurrent.RecursiveTask; public class SumTask extends RecursiveTask{ 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; } } }
ForkJoinPoolist die zentrale Klasse, die einen Pool von Arbeitsthreads verwaltet, umForkJoinTask-Instanzen auszuführen. Es verwendet einen arbeitsraubenden Algorithmus, um alle Threads zu beschäftigen, indem Aufgaben von ausgelasteten Threads auf inaktive Threads umverteilt werden.
Beispiel:
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); } }
RecursiveTaskwird verwendet, wenn Ihre Aufgabe ein Ergebnis zurückgibt, während RecursiveAction verwendet wird, wenn sie kein Ergebnis zurückgibt.
Beispiel mitRecursiveAction:
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); } } }
Durch Ausführen vonForkJoinExamplewird die Summe der Array-Elemente ausgegeben. Das Fork/Join-Framework unterteilt die Aufgabe in kleinere Blöcke und verarbeitet sie parallel, was insbesondere bei großen Datensätzen zu erheblichen Leistungsverbesserungen führt.
Zum Beispiel die Zahlen von 1 bis 100 zusammenfassen:
Sum: 5050
Im Fall vonPrintTaskteilt das Framework die Array-Druckaufgabe auf, führt sie parallel aus und gibt die Segmente gleichzeitig aus:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ...
Das Fork/Join Framework ist ein leistungsstarkes Tool in Java zur Optimierung paralleler Verarbeitungsaufgaben. Es eignet sich hervorragend für Szenarien, in denen Aufgaben in kleinere Teilaufgaben zerlegt, unabhängig voneinander ausgeführt und dann kombiniert werden können, um das Endergebnis zu erzielen. Obwohl es zu Komplexität führt, überwiegen die Leistungsvorteile in Multi-Core-Umgebungen oft die Nachteile, was es zu einer ausgezeichneten Wahl für CPU-gebundene und große rekursive Probleme macht.
Weitere Beiträge finden Sie unter: Was ist Fork/Join Framework in Java?
Das obige ist der detaillierte Inhalt vonWas ist das Fork/Join-Framework in Java?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!