Rumah  >  Artikel  >  Java  >  Panduan untuk menggunakan rangka kerja Fork/Join dalam pengaturcaraan selari Java

Panduan untuk menggunakan rangka kerja Fork/Join dalam pengaturcaraan selari Java

WBOY
WBOYasal
2024-04-19 08:51:01677semak imbas

Panduan Rangka Kerja Java Fork/Join: Buat tugasan Fork/Join: Gunakan sambungan kelas RecursiveAction (tiada nilai pulangan) atau RecursiveTask (dengan nilai pulangan) untuk melaksanakan kaedah pengiraan. Buat kolam Fork/Join: Gunakan ForkJoinPool untuk menentukan bilangan utas. Hantar tugasan: Gunakan fork() untuk menyerahkan tugasan dan join() untuk menunggu keputusan. Uraikan tugasan: panggil fork() dan join() dalam kaedah pengiraan untuk mengurai tugas. Kes praktikal (isih cepat): Buat tugasan QuickSortTask dan serahkannya kepada ForkJoinPool untuk dilaksanakan.

Java并行编程中 Fork/Join 框架的使用指南

Panduan untuk menggunakan rangka kerja Fork/Join dalam pengaturcaraan selari Java

Rangka kerja Fork/Join ialah kaedah peringkat tinggi untuk penyelarasan tugas dalam model pengaturcaraan selari Java. Ia menggunakan strategi bahagi-dan-takluk, menguraikan tugas kepada subtugas, kemudian melaksanakannya secara selari, dan akhirnya menggabungkan hasilnya. Panduan ini akan memperkenalkan cara menggunakan rangka kerja Fork/Join dan menunjukkannya melalui kes praktikal.

Mencipta tugasan Fork/Join

Asas rangka kerja Fork/Join ialah kelas RecursiveAction dan RecursiveTask. RecursiveActionRecursiveTask 类。

  • RecursiveAction 用于没有返回值的任务。
  • RecursiveTask 用于带有返回值的任务。

要创建任务,需要扩展这两种类并实现 compute 方法。compute 方法是任务执行的代码。

创建 Fork/Join 池

Fork/Join 框架使用 ForkJoinPool 对象来管理任务的执行。它是线程池,用于调度和执行任务。创建池时,可以指定线程数量。

ForkJoinPool pool = new ForkJoinPool(Runtime.getRuntime().availableProcessors());

提交任务

要提交任务,请使用 fork()join() 方法。fork() 方法将任务提交到池中,而 join() 方法等待任务完成并返回结果(对于 RecursiveTask 任务)。

pool.fork(task);
long result = pool.join();

分解任务

对于大型任务,可以将其分解成更小的子任务。为此,可以在 compute 方法中调用 fork()join() 方法。

@Override
protected void compute() {
  if (problem.isTooBig()) {
    ForkJoinTask leftTask = new LeftTask(leftHalf);
    ForkJoinTask rightTask = new RightTask(rightHalf);
    leftTask.fork();
    rightTask.fork();
    leftTask.join();
    rightTask.join();
  } else {
    // solve the problem directly
  }
}

实战案例:快速排序

以下是一个使用 Fork/Join 框架的快速排序算法示例:

public class QuickSortTask extends RecursiveTask<long[]> {

  private int[] array;
  private int low;
  private int high;

  public QuickSortTask(int[] array, int low, int high) {
    this.array = array;
    this.low = low;
    this.high = high;
  }

  @Override
  protected long[] compute() {
    if (low < high) {
      int pivot = partition(array, low, high);
      ForkJoinTask leftTask = new QuickSortTask(array, low, pivot - 1);
      ForkJoinTask rightTask = new QuickSortTask(array, pivot + 1, high);
      leftTask.fork();
      rightTask.fork();
      leftTask.join();
      rightTask.join();
    }
    return array;
  }

  private int partition(int[] array, int low, int high) {
    // ...
  }

}

要使用此算法,请创建一个 QuickSortTask 对象并将其提交到 ForkJoinPool

ForkJoinPool pool = new ForkJoinPool();
int[] array = {5, 3, 8, 2, 1, 4};
QuickSortTask task = new QuickSortTask(array, 0, array.length - 1);
pool.invoke(task);

结论

Fork/Join 框架提供了一种简单易用的方法,用于在 Java 中进行任务并行化。通过分而治之的策略,可以有效地分解大型任务并并行执行。通过使用 RecursiveActionRecursiveTask 类,以及 ForkJoinPool

  • RecursiveAction digunakan untuk tugasan yang tidak mempunyai nilai pulangan.
  • RecursiveTask digunakan untuk tugasan dengan nilai pulangan.
Untuk membuat tugasan, anda perlu melanjutkan dua kelas ini dan melaksanakan kaedah compute. Kaedah compute ialah kod untuk pelaksanaan tugas. 🎜🎜🎜Buat kolam Fork/Join🎜🎜🎜Rangka kerja Fork/Join menggunakan objek ForkJoinPool untuk mengurus pelaksanaan tugas. Ia adalah kumpulan benang yang digunakan untuk menjadualkan dan melaksanakan tugas. Apabila membuat kolam, anda boleh menentukan bilangan utas. 🎜rrreee🎜🎜Serah tugas🎜🎜🎜Untuk menyerahkan tugas, gunakan kaedah fork() dan join(). Kaedah fork() menyerahkan tugasan ke kumpulan, manakala kaedah join() menunggu tugasan selesai dan mengembalikan hasilnya (untuk RecursiveTask tugas). 🎜rrreee🎜🎜Pecahkan tugasan🎜🎜🎜Untuk tugasan yang besar, pecahkannya kepada subtugas yang lebih kecil. Untuk melakukan ini, anda boleh memanggil kaedah <code>fork() dan join() dalam kaedah compute. 🎜rrreee🎜🎜Kes Praktikal: Isih Pantas🎜🎜🎜Berikut ialah contoh algoritma isihan pantas menggunakan rangka kerja Fork/Join: 🎜rrreee🎜Untuk menggunakan algoritma ini, cipta objek QuickSortTask dan serahkan it To ForkJoinPool: 🎜rrreee🎜🎜Kesimpulan🎜🎜🎜Rangka kerja Fork/Join menyediakan cara yang mudah dan mudah untuk menyelaraskan tugas di Java. Melalui strategi bahagi-dan-takluk, tugas-tugas besar boleh dipecahkan dengan cekap dan dilaksanakan secara selari. Tugasan selari boleh dibuat dan diurus dengan mudah dengan menggunakan kelas RecursiveAction dan RecursiveTask, serta ForkJoinPool. 🎜

Atas ialah kandungan terperinci Panduan untuk menggunakan rangka kerja Fork/Join dalam pengaturcaraan selari 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