Java 中 CyclicBarrier 的作用是什么?

· 约 4 分钟读完 · 第 82 / 274 章

推荐答案

CyclicBarrier 是 Java 并发包中的一个同步工具类,它允许一组线程互相等待,直到所有线程都到达某个公共屏障点(barrier point)后,这些线程才会继续执行。CyclicBarrier 可以重复使用,因此称为“循环屏障”。

本题详细解读

1. CyclicBarrier 的基本概念

CyclicBarrier 是一个同步辅助类,它允许一组线程互相等待,直到所有线程都到达某个屏障点。与 CountDownLatch 不同,CyclicBarrier 可以重复使用,即在所有线程到达屏障点后,屏障会被重置,可以再次使用。

2. CyclicBarrier 的使用场景

CyclicBarrier 通常用于以下场景:

  • 多线程任务分解:将一个任务分解为多个子任务,每个子任务由一个线程执行,所有子任务完成后,主任务才能继续执行。
  • 并行计算:在并行计算中,多个线程需要同时完成某个阶段的计算,才能进入下一个阶段。

3. CyclicBarrier 的核心方法

  • CyclicBarrier(int parties):构造方法,指定需要等待的线程数量。
  • CyclicBarrier(int parties, Runnable barrierAction):构造方法,指定需要等待的线程数量和一个屏障动作(Runnable),当所有线程到达屏障点时,会执行这个动作。
  • await():线程调用此方法后,会进入等待状态,直到所有线程都调用了 await() 方法。
  • reset():重置屏障,使其可以再次使用。

4. CyclicBarrier 的示例代码

5. CyclicBarrier 的注意事项

  • 线程中断:如果某个线程在等待过程中被中断,其他线程会抛出 BrokenBarrierException。
  • 屏障重置:CyclicBarrier 可以重复使用,但在使用 reset() 方法重置屏障时,需要确保没有线程正在等待,否则会抛出 BrokenBarrierException。

6. CyclicBarrier 与 CountDownLatch 的区别

  • 可重用性:CyclicBarrier 可以重复使用,而 CountDownLatch 只能使用一次。
  • 线程等待:CyclicBarrier 是所有线程互相等待,而 CountDownLatch 是一个或多个线程等待其他线程完成。

通过以上内容,可以更好地理解 CyclicBarrier 的作用及其在并发编程中的应用。