CyclicBarrier是Java中用于多线程同步的工具,允许多个线程在到达某个屏障点时相互等待,直至全部线程就绪后才共同继续执行。与CountDownLatch的一次性不同,CyclicBarrier可重复使用,适用于分阶段、迭代式的并发任务场景。其核心机制是通过await()方法阻塞线程,直到指定数量的线程都调用了await(),此时若设置了barrierAction,则由最后一个到达的线程执行该操作,随后所有线程被释放。常见应用场景包括数据并行处理、图像处理、批处理系统、模拟仿真、游戏加载和性能测试等,尤其适合需要“集体出发”模式的协同任务。使用时需注意BrokenBarrierException异常、barrierAction的轻量化设计、线程中断处理、死锁风险以及reset()方法的安全调用时机,确保同步逻辑的稳定与高效。

Java中的
CyclicBarrier
CountDownLatch
CyclicBarrier
CyclicBarrier
CyclicBarrier(int parties)
CyclicBarrier(int parties, Runnable barrierAction)
parties
barrierAction
Runnable
barrierAction
当一个线程调用
CyclicBarrier
await()
parties
await()
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class CyclicBarrierExample {
public static void main(String[] args) {
int parties = 3; // 假设有3个线程参与
CyclicBarrier barrier = new CyclicBarrier(parties, () -> {
// 当所有线程都到达屏障时,会执行这个Runnable
System.out.println("所有线程都到达屏障了,开始下一阶段!");
});
ExecutorService executor = Executors.newFixedThreadPool(parties);
for (int i = 0; i < parties; i++) {
final int taskId = i;
executor.submit(() -> {
try {
System.out.println("任务 " + taskId + " 正在执行第一阶段...");
TimeUnit.SECONDS.sleep((long) (Math.random() * 3)); // 模拟耗时操作
System.out.println("任务 " + taskId + " 完成第一阶段,等待其他任务...");
barrier.await(); // 线程到达屏障点,等待其他线程
System.out.println("任务 " + taskId + " 开始执行第二阶段...");
TimeUnit.SECONDS.sleep((long) (Math.random() * 2)); // 模拟耗时操作
System.out.println("任务 " + taskId + " 完成第二阶段。");
} catch (Exception e) {
System.err.println("任务 " + taskId + " 发生异常: " + e.getMessage());
}
});
}
executor.shutdown();
}
}说实话,刚接触并发编程的时候,我总会把
CyclicBarrier
CountDownLatch
CountDownLatch
CountDownLatch
立即学习“Java免费学习笔记(深入)”;
CyclicBarrier
CyclicBarrier
跟
Semaphore
Semaphore
ReentrantLock
synchronized
CyclicBarrier
在我多年的开发经验中,
CyclicBarrier
数据并行处理与分阶段任务: 这大概是最经典的场景了。设想一下,你有一个巨大的数据集需要处理,为了提高效率,你把数据分成N份,然后启动N个线程去并行处理。但处理完第一阶段后,你可能需要对这些局部结果进行一次全局的汇总、校验或者合并,然后再进入第二阶段的处理。
多人游戏或分布式系统中的同步: 在需要多个参与者在某个特定时刻同步状态的场景,
CyclicBarrier
CyclicBarrier
CyclicBarrier
并发性能测试: 当你需要模拟大量并发用户同时发起请求时,
CyclicBarrier
CyclicBarrier
这些场景的核心共同点是:任务需要分阶段进行,且每个阶段的开始都需要所有参与者都达到一个共同的“就绪”状态。
CyclicBarrier
BrokenBarrierException: 这是最常见的一个异常。当一个线程在等待屏障时被中断、超时,或者屏障被重置,甚至其他等待的线程在屏障点抛出了异常,都可能导致其他等待线程抛出
BrokenBarrierException
BrokenBarrierException
await()
await(long timeout, TimeUnit unit)
barrierAction的执行:
barrierAction
barrierAction
barrierAction
barrierAction
线程中断处理: 和其他同步工具一样,当线程在
await()
InterruptedException
InterruptedException
Thread.currentThread().interrupt();
死锁风险: 虽然
CyclicBarrier
barrierAction
await()
barrierAction
重置(reset)的时机:
CyclicBarrier
reset()
reset()
BrokenBarrierException
reset()
reset()
await()
总的来说,
CyclicBarrier
以上就是Java中CyclicBarrier的应用场景的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号