推荐答案
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 的示例代码
// www.javascriptcn.com code example
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierExample {
public static void main(String[] args) {
int threadCount = 3;
CyclicBarrier barrier = new CyclicBarrier(threadCount, () -> {
System.out.println("所有线程已到达屏障点,继续执行");
});
for (int i = 0; i < threadCount; i++) {
new Thread(() -> {
try {
System.out.println(Thread.currentThread().getName() + " 到达屏障点");
barrier.await();
System.out.println(Thread.currentThread().getName() + " 继续执行");
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
}).start();
}
}
}5. CyclicBarrier 的注意事项
- 线程中断:如果某个线程在等待过程中被中断,其他线程会抛出
BrokenBarrierException。 - 屏障重置:
CyclicBarrier可以重复使用,但在使用reset()方法重置屏障时,需要确保没有线程正在等待,否则会抛出BrokenBarrierException。
6. CyclicBarrier 与 CountDownLatch 的区别
- 可重用性:
CyclicBarrier可以重复使用,而CountDownLatch只能使用一次。 - 线程等待:
CyclicBarrier是所有线程互相等待,而CountDownLatch是一个或多个线程等待其他线程完成。
通过以上内容,可以更好地理解 CyclicBarrier 的作用及其在并发编程中的应用。