CyclicBarrier Class in Java

2025 年 3 月 28 日 | 阅读 4 分钟

在多线程编程中,会创建多个线程,关键在于在执行的某个时刻,这些线程需要进行同步。Java 中的 CyclicBarrier 是一个非常适合固定数量线程的解决方案,这些线程可以在某个屏障点汇合,然后继续各自的工作。在本文中,作者将使用解释和概念验证来讲解 CyclicBarrier 类的正确使用方法。

什么是 CyclicBarrier?

名为 CyclicBarrier 的对象在 Java 中充当同步点,它允许一组线程聚集并等待其他线程加入。当所有线程都到达屏障点后,它们将被释放,以便继续执行。之所以称之为“循环”(cyclic),是因为屏障点可以在所有线程释放后重置和重复使用,这一点与其他同步对象(如 CountDownLatch)不同。

CyclicBarrier 类的构造函数

CyclicBarrier 类提供了两个主要的构造函数:

CyclicBarrier(int parties): 此构造函数创建一个必须等待指定数量线程(或“参与者”)的屏障。

CyclicBarrier(int parties, Runnable barrierAction): 此构造函数创建一个同步辅助,一旦达到指定数量的线程,它就会执行一个指定的 barrierAction,然后释放线程。

CyclicBarrier 类的方法

await(): 每个线程调用此方法以等待其他线程到达屏障。当所有线程到达屏障时,它们将被释放,如果存在 barrierAction,则会执行它。

reset(): 如果需要再次使用屏障,此方法可将屏障重置为新状态。

getParties(): 返回达到屏障所需的总线程数。

getNumberWaiting(): 返回当前在该指定屏障处等待的线程数。

文件名:CyclicBarrierExample.java

输出

 
Thread-0 is waiting at the barrier
Thread-2 is waiting at the barrier
Thread-1 is waiting at the barrier
All threads have reached the barrier, let's proceed!
Thread-0 has crossed the barrier
Thread-1 has crossed the barrier
Thread-2 has crossed the barrier   

CyclicBarrier 类的使用场景

CyclicBarrier 在需要多个线程协作并需要不时相互等待的情况下特别有用,例如:

  • 并行计算: 一种将工作分解成多个任务的方法,其中一些任务必须同时完成,并在过程中的特定点进行协调。
  • 模拟: 用于科学或游戏模拟,其中有许多组件需要不时地相互同步。
  • 多线程算法: 算法中,多个线程处理数据,交换结果,并在进行下一步之前必须同步。

注意事项和边缘情况

在使用 CyclicBarrier 时,需要处理以下边缘情况:

  • BrokenBarrierException: 如果任何线程在等待屏障时被中断,则屏障将被“破坏”,并且所有等待的线程都将抛出此异常。
  • 死锁: 确保所有线程都汇聚到屏障点;如果并非所有线程都到达屏障,程序将陷入停滞,因为被挂起的线程将永远等待。
  • 可重用性: 考虑到同步任务可能执行的次数,它使屏障类型变得高效。

结论

Java 中的 CyclicBarrier 类是一个非常强大的类,用于控制和同步一组正在运行的线程。其循环特性保证了它可以被多次重用,因此非常适合许多并发编程场景。充分理解它使用的方法以及在此类 Java 程序同步辅助中可能出现的诸如 BrokenBarrierException 等问题,将有助于认识到这个同步辅助的实用性。


下一个主题Java 中的关联