CyclicBarrier是一个可重复使用的同步工具,用于让一组线程互相等待直至全部到达共同屏障点后同时继续执行,适用于分阶段任务或并行计算场景。
在Java多线程编程中,CyclicBarrier 是一个同步工具,用于让一组线程互相等待,直到所有线程都到达某个公共的屏障点(barrier point),然后再继续执行。它特别适合用于并行计算、分阶段任务等场景。与 CountDownLatch 不同,CyclicBarrier 可以重复使用,一旦被重置,就能再次投入使用。
CyclicBarrier 的构造函数需要指定参与的线程数量。当这些线程中的每一个都调用 await() 方法时,它们会被阻塞,直到最后一个线程也调用 await(),此时所有线程同时被释放,并可选择性地执行一个预定义的“结束动作”(barrier action)。
关键特性:
下面是一个简单的例子,展示如何使用 CyclicBarrier 让5个线程同时开始工作:
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierExample {
public static void main(String[] args) {
int threadCount = 5;
CyclicBarrier barrier = new CyclicBarrier(threadCount, () -> {
System.out.println("所有线程已就位,比赛开始!");
});
for (int i = 0; i < threadCount; i++) {
new Thread(new Worker(barrier)).start();
}
}
static class Worker implements Runnable {
private final CyclicBarrier barrier;
Worker(CyclicBarrier barrier) {
this.barrier = barrier;
}
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName() + " 准备就绪...");
barrier.await(); // 等待其他线程
System.out.println(Thread.currentThread().getName() + " 开始执行任务。");
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
输出可能如下:
Thread-0 准备就绪...CyclicBarrier 常用于以下情况:
示例:分阶段任务处理
CyclicBarrier stageBarrier = new CyclicBarrier(3);
Runnable task = () -> {
try {
System.out.println("第一阶段:" + Thread.currentThread().getName());
// 第一阶段工作
Thread.sleep(1000);
stageBarrier.await();
System.out.println("第二阶段:" + Thread.currentThread().getName());
// 第二阶段工作
Thread.sleep(1000);
s
tageBarrier.await();
System.out.println("第三阶段:" + Thread.currentThread().getName());
} catch (Exception e) {
e.printStackTrace();
}
};
for (int i = 0; i < 3; i++) {
new Thread(task).start();
}
使用 CyclicBarrier 时要注意几点: