cyclicbarrier 是 java 并发包中可重用的线程同步工具,用于多线程在屏障点等待并重复执行多阶段任务;其通过计数器控制线程阻塞与唤醒,支持构造时指定动作、超时机制及异常处理。

CyclicBarrier 是 Java 并发包(java.util.concurrent)中用于协调多个线程在某个“屏障点”同步等待的工具,特别适合需要**重复执行多阶段并行任务**的场景——比如每轮计算后都需全体线程达成一致再进入下一轮。
核心原理:等待 + 重置 + 可复用
CyclicBarrier 内部维护一个计数器(parties),表示需要到达屏障的线程数量。每个线程调用 await() 时:
- 若未满员,当前线程被阻塞,加入等待队列;
- 若刚好达到 parties 数量,所有等待线程被唤醒,屏障“打开”,计数器自动重置(因此叫 Cyclic);
- 下一轮可立即再次使用,无需重建对象。
基本用法:构造与 await
创建方式有两种:
-
指定参与线程数:
new CyclicBarrier(3)→ 需 3 个线程调用 await 才放行 -
带屏障开启后执行的动作:
new CyclicBarrier(3, () -> System.out.println("全部就绪,开始下一阶段"))→ 该 Runnable 在最后第 3 个线程到达时、其他线程被唤醒前执行(由最后一个到达的线程负责运行)
每个线程在关键同步点调用 barrier.await()。该方法会抛出 InterruptedException 或 BrokenBarrierException(如某线程中断或超时导致屏障损坏),需妥善处理。
典型循环场景示例
模拟 4 个工人协作完成 3 轮装配任务,每轮每人干一部分,全部完成后才进入下一轮:
CyclicBarrier barrier = new CyclicBarrier(4, () -> System.out.println("✅ 第" + (round.getAndIncrement()) + "轮完成"));
<p>for (int i = 0; i {
for (int r = 0; r </p><p>输出中你会看到:每轮必有 4 行“执行…”打印完毕后,才出现一次“✅ 第x轮完成”,体现严格同步。</p><h3>注意边界与异常处理</h3><p>实际使用要关注三点:</p>
-
屏障损坏不可逆:一旦发生
BrokenBarrierException(例如某线程 await 时被 interrupt),后续所有 await 都立即抛此异常,必须重建 CyclicBarrier -
超时控制:可用
await(long timeout, TimeUnit unit)避免无限等待;超时后当前线程继续执行,但屏障被标记为 broken - 线程安全:CyclicBarrier 本身是线程安全的,多个线程可并发调用 await,无需额外同步
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











