Rumah  >  Artikel  >  Java  >  Apakah Rangka Kerja Fork/Join di Java?

Apakah Rangka Kerja Fork/Join di Java?

PHPz
PHPzasal
2024-08-30 06:03:06725semak imbas

What is Fork/Join Framework in Java?

1. Apakah Rangka Kerja Fork/Join?

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.

2. Melaksanakan Rangka Kerja Fork/Join

2.1 ForkJoinTask

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;
        }
    }
}

2.2 ForkJoinPool

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);
    }
}

2.3 RecursiveTask vs RecursiveAction

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);
        }
    }
}

2.4 Demo dan Keputusan

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 
...

3. Pelbagai Dimensi Rangka Kerja Fork/Join

3.1 Kelebihan Fork/Join

  • Kecekapan : Menggunakan semua teras CPU yang tersedia, yang membawa kepada pelaksanaan tugas yang lebih pantas.
  • Skalabiliti : Boleh mengendalikan set data yang besar dengan memecahkannya kepada tugas yang lebih kecil dan boleh diurus.
  • Mencuri kerja : Menyibukkan semua utas dengan mengagihkan semula tugas daripada utas yang terlebih muatan kepada yang terbiar.

3.2 Kelemahan Fork/Join

  • Kerumitan : Memerlukan reka bentuk yang teliti dan pemahaman tentang keselarian, yang boleh meningkatkan kerumitan kod.
  • Overhed : Forking dan menyertai tugas mempunyai overhed yang wujud, yang mungkin tidak berfaedah untuk tugasan yang lebih kecil.
  • Nyahpepijat : Tugasan selari boleh mencabar untuk nyahpepijat disebabkan oleh sifat pelaksanaan utas yang tidak menentukan.

3.3 Bila Perlu Menggunakan Garpu/Sertai

  • Masalah Rekursif Besar : Apabila anda mempunyai tugasan yang secara semula jadi membahagikan kepada subtugas yang lebih kecil, seperti mengisih, mencari dan pendaraban matriks.
  • 1
  • Operasi terikat CPU : Tugas yang memerlukan pengiraan CPU intensif dan boleh mendapat manfaat daripada pelaksanaan selari.

4. Kesimpulan

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn