Heim >Java >javaLernprogramm >Was ist das Fork/Join-Framework in Java?
Das Fork/Join Framework ist Teil des Pakets java.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.
ForkJoinTask ist 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<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 ist die zentrale Klasse, die einen Pool von Arbeitsthreads verwaltet, um ForkJoinTask-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); } }
RecursiveTask wird verwendet, wenn Ihre Aufgabe ein Ergebnis zurückgibt, während RecursiveAction verwendet wird, wenn sie kein Ergebnis zurückgibt.
Beispiel mit 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); } } }
Durch Ausführen von ForkJoinExample wird 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 von PrintTask teilt 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. Auch wenn es die Komplexität mit sich bringt, ü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!