cyclicbarrier 是 java 并发包中可重用的线程同步工具,用于多线程在屏障点集体等待并协同进入下一阶段;支持屏障动作、自动重置,需捕获 interruptedexception 和 brokenbarrierexception 异常。

CyclicBarrier 是 Java 并发包(java.util.concurrent)中用于协调多个线程在某个“屏障点”同步等待的工具。它特别适合需要多线程分阶段协作的场景,比如并行计算、批量任务分片处理、模拟并发测试等——每个阶段所有线程必须全部到达后才能一起进入下一阶段。
理解 CyclicBarrier 的核心行为
CyclicBarrier 允许一组线程互相等待,直到所有线程都调用 await() 方法到达屏障点,才一同继续执行。与 CountDownLatch 不同,CyclicBarrier 可重用(“Cyclic” 即循环之意),且支持在所有线程到达时触发一个可选的 屏障动作(Runnable),常用于汇总结果或记录日志。
- 构造时指定参与线程数:
new CyclicBarrier(5)表示需 5 个线程都调用await()才放行 - 任意线程调用
await()后会阻塞,直到其余线程也到达;若超时未齐,则抛出BrokenBarrierException - 一旦放行,屏障自动重置(可再次使用),除非被中断或重置失败
实现阶段性集合点的典型结构
多阶段协作中,每个阶段结束前设一个 CyclicBarrier,确保所有线程完成当前阶段工作后再统一推进。例如:10 个线程并行处理一批数据,每处理完 100 条就同步一次,统计进度并检查是否需终止。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 定义全局 CyclicBarrier 实例,如
CyclicBarrier barrier = new CyclicBarrier(10, () -> System.out.println("✅ 阶段完成,进入下一阶段")); - 每个线程在阶段末尾调用
barrier.await();任一线程调用后即阻塞,直到第 10 个线程到达 - 屏障动作(Runnable)由最后一个到达的线程执行,适合做聚合、校验、状态更新等操作
- 若某线程中途异常或中断,屏障会被破坏(broken),后续调用 await() 将立即抛出 BrokenBarrierException
注意异常与重用的处理细节
实际使用中需主动捕获两类关键异常,并合理恢复或退出:
-
InterruptedException:当前线程被中断,应按业务逻辑决定是恢复中断状态(Thread.currentThread().interrupt())还是直接返回 -
BrokenBarrierException:表示屏障已被破坏(如某线程超时或中断),此时通常需清理资源、记录错误,并避免继续使用该 barrier - 若需重复使用,可在 catch 块中调用
barrier.reset()(慎用,仅当确认无其他线程正在 await 时);更推荐新建实例或设计为“一次性阶段 + 新 barrier”
一个简明的阶段性计算示例
假设有 4 个线程协同计算矩阵每行的和,每轮计算 2 行,共 8 行,需分 4 轮完成,每轮结束后打印总进度:
CyclicBarrier barrier = new CyclicBarrier(4, () -> System.out.println("? 第" + (++round) + "轮完成,累计处理 " + (round * 2) + " 行"));
// 每个线程执行:
for (int i = 0; i <p>这样既保证了线程间节奏一致,又避免了加锁计数器的开销,代码清晰且线程安全。</p>Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










