Rangka Kerja Fork/Join ialah sebahagian daripada pakej java.util.concurrent, yang diperkenalkan dalam Java 7. Ia direka bentuk untuk tugasan yang boleh dibahagikan secara rekursif kepada bahagian yang lebih kecil, di mana setiap bahagian boleh diproses secara bebas. Rangka kerja ini berfungsi berdasarkan prinsip bahagi dan takluk, menjadikannya sesuai untuk tugasan seperti menyusun, mencari dan algoritma rekursif yang lain.
ForkJoinTask ialah kelas asas untuk tugasan yang boleh dijalankan dalam Rangka Kerja Fork/Join. Ia menyediakan operasi teras yang membolehkan tugasan memotong subtugas baharu dan menyertainya setelah selesai.
Contoh:
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 ialah kelas pusat yang menguruskan kumpulan urutan pekerja untuk melaksanakan kejadian ForkJoinTask. Ia menggunakan algoritma mencuri kerja untuk memastikan semua utas sibuk dengan mengagihkan semula tugas daripada utas sibuk kepada utas terbiar.
Contoh:
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 digunakan apabila tugas anda mengembalikan hasil, manakala RecursiveAction digunakan apabila ia tidak mengembalikan sebarang hasil.
Contoh menggunakan 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); } } }
Menjalankan ForkJoinExample akan mengeluarkan jumlah elemen tatasusunan. Rangka Kerja Fork/Join membahagikan tugas kepada bahagian yang lebih kecil dan memprosesnya secara selari, menunjukkan peningkatan prestasi yang ketara, terutamanya dengan set data yang besar.
Sebagai contoh, menjumlahkan nombor dari 1 hingga 100:
Sum: 5050
Dalam kes PrintTask , rangka kerja membahagikan tugas pencetakan tatasusunan, melaksanakannya secara selari dan mengeluarkan segmen secara serentak:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ...
Rangka Kerja Fork/Join ialah alat berkuasa dalam Java untuk mengoptimumkan tugas pemprosesan selari. Ia cemerlang dalam senario di mana tugas boleh dipecahkan kepada subtugas yang lebih kecil, dilaksanakan secara bebas, dan kemudian digabungkan untuk menghasilkan hasil akhir. Walaupun ia memperkenalkan kerumitan, faedah prestasi dalam persekitaran berbilang teras selalunya mengatasi kelemahan, menjadikannya pilihan yang sangat baik untuk masalah berkaitan CPU dan rekursif yang besar.
Baca siaran lebih lanjut di : Apakah Rangka Kerja Fork/Join di Java?
Atas ialah kandungan terperinci Apakah Rangka Kerja Fork/Join di Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!