CyclicBarrier 是 Java 并发包中支持重复使用的线程同步工具,用于多个线程在屏障点等待彼此到达后共同继续执行;构造时指定线程数并可选屏障动作,await() 阻塞直至全部到达,支持超时和异常处理,reset() 可主动重置。

CyclicBarrier 是 Java 并发包(java.util.concurrent)中用于线程协作的同步工具,适用于多个线程需要在某个“屏障点”等待彼此到达后,再一起继续执行的场景。它支持重复使用(即“循环”),比 CountDownLatch 更灵活。
基本用法:构造与 await()
创建一个 CyclicBarrier 时需指定参与线程总数,并可选传入一个 屏障动作(Runnable),该动作会在所有线程到达后、释放前由其中一个线程执行。
- 构造方式:
CyclicBarrier barrier = new CyclicBarrier(3);表示等待 3 个线程都调用await() - 每个线程执行到关键点时调用
barrier.await()—— 此方法会阻塞,直到其他线程也到达 - 所有线程都到达后,它们同时被唤醒,继续向下执行;屏障自动重置,可再次使用
处理异常和超时
await() 可能抛出两种受检异常,必须处理:
-
InterruptedException:当前线程被中断时抛出 -
BrokenBarrierException:屏障被破坏(如某线程在 await 时中断/超时,或屏障重置前其他线程已离开) - 支持带超时的版本:
barrier.await(10, TimeUnit.SECONDS),超时未凑齐则抛TimeoutException(属于运行时异常)
屏障动作(Barrier Action)的实用价值
通过构造函数传入的 Runnable,可用于在所有线程就绪后、并发执行前做统一初始化或日志记录:
立即学习“Java免费学习笔记(深入)”;
- 例如:汇总前置结果、校验数据一致性、打印“批次开始”日志
- 该动作由最后一个到达的线程执行,执行期间其他线程仍在
await()中阻塞 - 若屏障动作抛出异常,所有正在等待的线程都会收到
BrokenBarrierException
重用与重置机制
CyclicBarrier 的核心优势是“可循环”:
- 每次所有线程通过后,屏障自动复位,无需重建对象
- 主动重置可用
barrier.reset()—— 这会使所有已等待线程收到BrokenBarrierException,适用于异常中止当前批次 - 注意:重置后,之前未 await 的线程再调用 await 会立即抛异常,应确保线程逻辑能正确响应


















