CyclicBarrier是Java中用于线程同步的工具,允许多个线程相互等待直至全部到达屏障点后共同继续执行,支持重复使用,适用于多阶段并行任务、并发测试和游戏同步等场景。

在Java中,CyclicBarrier 是一个用于线程同步的工具类,位于 java.util.concurrent 包中。它允许一组线程相互等待,直到所有线程都到达某个公共屏障点(barrier point),然后才继续执行。这种机制特别适用于多线程协作完成阶段性任务的场景。
什么是CyclicBarrier?
CyclicBarrier 的字面意思是“可循环使用的屏障”。当指定数量的线程都调用了 await() 方法后,这些线程会被阻塞,直到最后一个线程到达,此时所有线程同时被释放,可以继续执行。之后,这个屏障可以被重用(即“循环”)。
构造方法主要有两个:
-
CyclicBarrier(int parties):指定需要等待的线程数量。 -
CyclicBarrier(int parties, Runnable barrierAction):在所有线程到达屏障后,优先执行一个指定的 Runnable 任务。
基本使用示例
下面是一个简单的例子,模拟4个线程协同工作,必须全部准备就绪后才能开始下一步:
立即学习“Java免费学习笔记(深入)”;
一套面向小企业用户的企业网站程序!功能简单,操作简单。实现了小企业网站的很多实用的功能,如文章新闻模块、图片展示、产品列表以及小型的下载功能,还同时增加了邮件订阅等相应模块。公告,友情链接等这些通用功能本程序也同样都集成了!同时本程序引入了模块功能,只要在系统默认模板上创建模块,可以在任何一个语言环境(或任意风格)的适当位置进行使用!
import java.util.concurrent.CyclicBarrier;public class CyclicBarrierExample { public static void main(String[] args) { int threadCount = 4; CyclicBarrier barrier = new CyclicBarrier(threadCount, () -> System.out.println("✅ 所有线程已就绪,开始执行下一阶段!"));
for (int i = 1; i <= threadCount; i++) { new Thread(() -> { try { String threadName = Thread.currentThread().getName(); System.out.println("? " + threadName + " 正在准备..."); Thread.sleep((long)(Math.random() * 3000)); // 模拟准备工作耗时 System.out.println("✅ " + threadName + " 准备完成,等待其他线程..."); barrier.await(); // 等待其他线程 System.out.println("? " + threadName + " 开始执行后续任务!"); } catch (Exception e) { e.printStackTrace(); } }, "Thread-" + i).start(); } }}
输出可能如下:
? Thread-1 正在准备... ? Thread-2 正在准备... ✅ Thread-1 准备完成,等待其他线程... ? Thread-3 正在准备... ✅ Thread-2 准备完成,等待其他线程... ? Thread-4 正在准备... ✅ Thread-4 准备完成,等待其他线程... ✅ Thread-3 准备完成,等待其他线程... ✅ 所有线程已就绪,开始执行下一阶段! ? Thread-1 开始执行后续任务! ? Thread-2 开始执行后续任务! ? Thread-3 开始执行后续任务! ? Thread-4 开始执行后续任务!
实际应用场景
1. 多阶段并行任务
比如在科学计算或大数据处理中,多个线程分别处理数据块,必须等所有线程完成第一阶段后,才能进入第二阶段。
2. 性能测试中的并发启动
希望多个线程同时开始执行任务,以模拟真实高并发场景。可以通过 CyclicBarrier 实现“统一起跑线”。
3. 游戏开发中的同步逻辑
多个玩家线程需要等待所有人加载完毕后,游戏才能开始。
注意事项与常见问题
- 异常处理:如果某个线程在等待过程中被中断或抛出异常,会导致屏障被“打破”,其他线程会收到 BrokenBarrierException。
- 可重用性:一旦所有线程通过屏障,计数会自动重置,可以再次使用。
- 与 CountDownLatch 的区别:CountDownLatch 是一次性的,而 CyclicBarrier 可重复使用。
基本上就这些。CyclicBarrier 提供了一种简洁高效的线程同步方式,适合需要“集体等待”的场景。合理使用它,可以让多线程协作更清晰、可控。









