Java并发编程CyclicBarrier栅栏原理与使用实例
在Java多线程开发中,除了CountDownLatch,CyclicBarrier同样是重要的同步工具。本文解析CyclicBarrier的原理,并通过代码实例展示如何实现多个线程相互等待后共同执行后续逻辑。
CyclicBarrier与闭锁的区别
CyclicBarrier(栅栏)与CountDownLatch(闭锁)虽然都用于控制线程执行顺序,但核心逻辑不同:
- 闭锁(CountDownLatch):强调一个或多个事件的发生。通常由主线程等待特定数量的countDown事件完成,一旦计数器归零,所有等待的线程即可继续执行。
- 栅栏(CyclicBarrier):强调多个线程之间的相互等待。它指定了需要参与同步的线程数量(N个),只有当所有N个线程都调用await()方法到达屏障点时,才会同时释放,允许所有线程继续执行。此外,CyclicBarrier支持设置barrierAction(屏障动作),在所有线程到达后执行一段 Runnable 任务。
应用场景分析
最典型的应用场景是“多点集合”或“协同作业”。例如:10名队员去春游,规定必须在指定地点全部到齐后,才能统一出发前往下一景点。如果某人迟到,所有人都必须等待。
第1步:定义工作线程与资源
创建一个实现Runnable接口的Worker类,内部持有CyclicBarrier引用。在线程执行过程中,调用barrier.await()挂起自身,等待其他同伴。
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
class CyclicBarrierWorker implements Runnable {
private int id;
private CyclicBarrier barrier;
public CyclicBarrierWorker(int id, final CyclicBarrier barrier) {
this.id = id;
this.barrier = barrier;
}
@Override
public void run() {
try {
System.out.println(id + " th people wait");
// 等待其他线程到达
barrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
}
}
第2步:初始化栅栏并启动线程
在main方法中创建CyclicBarrier实例,参数包括parties(参与者数量)和barrierAction(可选,当所有线程到达时执行的回调任务)。随后启动多个线程模拟人员集合。
public class TestCyclicBarrier {
public static void main(String[] args) {
int num = 10;
// 初始化栅栏,10人到达后执行回调
CyclicBarrier barrier = new CyclicBarrier(num, new Runnable() {
@Override
public void run() {
System.out.println("go on together!");
}
});
// 启动10个线程
for (int i = 1; i <= num; i++) {
new Thread(new CyclicBarrierWorker(i, barrier)).start();
}
}
}
运行结果与结论
程序输出显示,前10行依次打印了各线程的等待状态。由于栅栏机制要求全员到齐,直到最后一个线程(第10人)调用await()触发屏障,此时才会执行回调任务,输出最后一行结果。
1 th people wait
2 th people wait
...
10 th people wait
go on together!
通过CyclicBarrier,我们可以轻松构建需要多线程度数一致后再统一行动的并发模型。以上就是Java并发编程之CyclicBarrier栅栏实例介绍的详细内容,更多关于Java并发编程的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













