Rumah  >  Artikel  >  Java  >  Bagaimana untuk menggunakan halangan untuk mencapai penyegerakan benang dalam pengaturcaraan serentak Java?

Bagaimana untuk menggunakan halangan untuk mencapai penyegerakan benang dalam pengaturcaraan serentak Java?

王林
王林asal
2024-05-04 16:06:02985semak imbas

Penghalang ialah alat penyegerakan yang digunakan untuk membuat sekumpulan utas menunggu sehingga semua utas mencapai titik yang ditentukan sebelum meneruskan pelaksanaan. Halangan boleh dibuat menggunakan java.util.concurrent.CyclicBarrier, dan setiap utas bergabung dengan halangan dan menunggu utas lain dengan memanggil kaedah await(). Apabila semua benang telah mencapai halangan, mereka meneruskan pelaksanaan. Halangan boleh digunakan untuk memastikan tiada operasi seterusnya dilakukan sehingga semua benang menyelesaikan pengiraannya.

Bagaimana untuk menggunakan halangan untuk mencapai penyegerakan benang dalam pengaturcaraan serentak Java?

Menggunakan halangan untuk mencapai penyegerakan utas dalam pengaturcaraan serentak Java

Halangan ialah alat penyegerakan dalam pengaturcaraan serentak yang membolehkan sekumpulan utas menunggu sehingga semua utas mencapai titik tertentu sebelum meneruskan pelaksanaan. Ini berguna dalam senario tertentu, seperti melakukan operasi seterusnya selepas semua rangkaian telah melengkapkan pemulaan.

Create Barrier

Kita boleh menggunakan kelas java.util.concurrent.CyclicBarrier untuk mencipta penghalang. Pembina kelas ini menerima parameter integer yang mewakili bilangan benang dalam penghalang. java.util.concurrent.CyclicBarrier 类来创建屏障。该类的构造函数接收一个整数参数,表示屏障中线程的数量。

CyclicBarrier barrier = new CyclicBarrier(4);

使用屏障

要使用屏障,每个线程都必须调用 await() 方法。该方法将阻塞线程,直到屏障中所有线程都调用了 await() 方法。当所有线程都到达屏障后,它们将继续执行。

for (int i = 0; i < 4; i++) {
    new Thread(() -> {
        try {
            barrier.await();
        } catch (InterruptedException | BrokenBarrierException e) {
            e.printStackTrace();
        }
    }).start();
}

实战案例

假设我们有一组线程需要生成一个报告,只有当所有线程都完成其计算后才能汇总。我们可以使用屏障来确保在所有线程完成计算之前不会开始汇总。

cyclicBarrier.await();
// 汇总结果并生成报告

注意事项

  • 屏障是一种同步工具,它会使程序变慢,因此在使用时应仔细考虑。
  • 屏障不支持中断,因此在某个线程阻塞在屏障时,其他线程无法中断它。
  • 屏障支持超时,如果指定的时间内某个线程没有到达屏障,则屏障将抛出 BrokenBarrierExceptionrrreee
Menggunakan Halangan🎜🎜🎜Untuk menggunakan penghalang, setiap utas mesti memanggil kaedah await(). Kaedah ini menyekat utas sehingga semua utas dalam penghalang telah memanggil kaedah await(). Apabila semua benang telah mencapai halangan, mereka meneruskan pelaksanaan. 🎜rrreee🎜🎜Kes Praktikal🎜🎜🎜 Katakan kita mempunyai sekumpulan utas yang perlu menjana laporan yang hanya boleh diringkaskan apabila semua utas telah menyelesaikan pengiraan mereka. Kita boleh menggunakan penghalang untuk memastikan pengagregatan tidak bermula sehingga semua urutan menyelesaikan pengiraannya. 🎜rrreee🎜🎜Nota🎜🎜
  • Penghalang ialah alat penyegerakan yang boleh memperlahankan atur cara dan harus dipertimbangkan dengan teliti semasa menggunakannya. 🎜
  • Penghalang tidak menyokong gangguan, jadi apabila utas disekat dalam penghalang, utas lain tidak boleh mengganggunya. 🎜
  • Penghalang menyokong tamat masa Jika utas tidak mencapai halangan dalam masa yang ditentukan, penghalang akan membuang pengecualian BrokenBarrierException dan semua utas lain akan terus dilaksanakan. 🎜🎜

Atas ialah kandungan terperinci Bagaimana untuk menggunakan halangan untuk mencapai penyegerakan benang dalam pengaturcaraan serentak 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