江苏建设科技网站,做信息图的网站,郑州网站建设zzjisu,阿里云服务器一年多少钱CyclicBarrier的 常用场景及使用示例
CyclicBarrier是Java并发编程中的另一种同步辅助工具#xff0c;它用于控制多个线程相互等待#xff0c;直到所有线程都到达一个共同的屏障点#xff0c;然后所有线程才会继续执行。与CountDownLatch不同的是#xff0c;CyclicBarrier…CyclicBarrier的 常用场景及使用示例
CyclicBarrier是Java并发编程中的另一种同步辅助工具它用于控制多个线程相互等待直到所有线程都到达一个共同的屏障点然后所有线程才会继续执行。与CountDownLatch不同的是CyclicBarrier是可以重复使用的即在所有线程释放后屏障可以再次用于下一轮的同步。以下是CyclicBarrier的一些常用场景及一个简单的使用示例
常用场景
并行计算后的汇总: 在并行处理大量数据后需要等待所有处理线程完成然后将结果汇总或进一步处理。阶段任务同步: 在涉及多个步骤的处理流程中每个阶段完成后所有参与线程需要同步确保下一阶段能从同一时间点开始。游戏或模拟中的回合制同步: 在游戏或物理模拟中可能需要所有参与者或模拟组件完成当前回合的操作后再开始下一回合。批量处理: 在分批次处理任务时每个批次内的所有任务完成后再进行批次间的处理或切换。
使用示例
下面的示例演示了如何使用CyclicBarrier来同步四个工作线程这些线程各自执行任务然后等待所有线程完成后再一起进入下一轮工作
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;public class CyclicBarrierExample {public static void main(String[] args) {int parties 4; // 参与线程数CyclicBarrier barrier new CyclicBarrier(parties, new Runnable() {Overridepublic void run() {System.out.println(所有线程已到达屏障开始汇总结果或进行下一轮准备...);}});for (int i 0; i parties; i) {new Thread(new Worker(barrier, Worker- i)).start();}}static class Worker implements Runnable {private final CyclicBarrier barrier;private final String name;Worker(CyclicBarrier barrier, String name) {this.barrier barrier;this.name name;}Overridepublic void run() {try {for (int i 0; i 3; i) { // 每个线程执行三次任务Thread.sleep((long) (Math.random() * 1000)); // 模拟任务执行时间System.out.println(name 第 (i 1) 次任务完成);barrier.await(); // 等待所有线程完成当前轮次}} catch (InterruptedException | BrokenBarrierException e) {Thread.currentThread().interrupt();e.printStackTrace();}}}
}在这个示例中每个Worker线程执行三次任务每次任务完成后调用barrier.await()等待其他所有线程完成当前轮次的任务。当所有线程都调用了await()屏障打开所有线程继续执行下一轮同时指定的Runnable在这个例子中用于打印汇总信息会被执行一次。CyclicBarrier的构造函数接受一个额外的Runnable参数这个任务会在每个屏障点被所有线程跨越后执行非常适合用来执行一些汇总或清理操作。