CyclicBarrier一个简单Demo

本文通过一个具体的 Java 示例介绍了 CyclicBarrier 的使用方法。该示例创建了一个包含 10 个线程的任务,所有线程都必须等待彼此完成工作才能继续执行。当所有线程到达屏障点时,会触发一个任务结束的标志。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


package thread;

import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierDemo {
public static void main(String[] args) {
CyclicBarrier barrier = new CyclicBarrier(10,new Runnable(){
public void run(){
System.out.println("finished...");
}

});
for(int i=0;i<10;i++){
new Thread(new Work(barrier,i)).start();
}

}
}
class Work implements Runnable{
private CyclicBarrier barrier;
private int i = 0;
public Work(CyclicBarrier barrier,int i){
this.barrier = barrier;
this.i = i;
}
public void run(){
try {
doWork();
barrier.await();
} catch (Exception e) {
e.printStackTrace();
}
}
void doWork() {
System.out.println("working"+i+"......");
}
}
<think>好的,我需要帮助用户了解如何使用JavaCyclicBarrier实现线程间同步,并提供最佳实践和示例代码。首先,我得回顾一下CyclicBarrier的基本概念。CyclicBarrier一个同步辅助工具,允许一组线程相互等待,直到所有线程都到达屏障点后才会继续执行。这和CountDownLatch不同,因为CyclicBarrier可以重用,而CountDownLatch是一次性的。 接下来,用户需要最佳实践和示例代码。我应该先举一个简单的例子,比如多个线程在到达屏障点后执行某个动作。然后,可能需要更复杂的例子,比如分阶段任务或者结合其他工具使用。同时,需要注意线程池的使用,因为CyclicBarrier需要线程数量与屏障的parties一致,否则可能造成线程一直等待。 还要考虑异常处理,比如线程在await()时被中断,或者屏障被破坏的情况。最佳实践中应该包括处理这些异常的方法,比如重置屏障或者使用超时机制。另外,CyclicBarrier的Runnable参数可以在所有线程到达后执行一个特定动作,这个功能在示例中可以展示。 参考已有的引用内容,比如引用[2]和引用[5]提到了CyclicBarrier的基本用法和分阶段任务的应用。示例代码需要符合这些描述,确保正确性。同时,引用[4]提到CyclicBarrier适合循环性质的任务,这可能需要在示例中体现出来,比如多轮次的任务处理。 在编写代码时,要确保语法正确,比如正确初始化CyclicBarrier,合理使用try-catch处理BrokenBarrierException和InterruptedException。另外,线程池的关闭也不能忽略,避免资源泄漏。 最后,总结最佳实践时,需要涵盖参数设置、异常处理、重置机制、与线程池的配合以及任务设计等方面,确保用户能够全面了解如何有效使用CyclicBarrier。</think>### Java CyclicBarrier 实现线程同步详解 #### 一、核心机制 CyclicBarrier 通过 `await()` 方法实现线程同步,当指定数量的线程全部调用该方法后,会触发以下操作: 1. 执行预定义的屏障动作(构造函数中的 Runnable 参数) 2. 所有等待线程恢复执行 3. 屏障自动重置(可循环使用) #### 二、基础实现示例 ```java public class BasicDemo { private static final int THREAD_COUNT = 3; private static final CyclicBarrier barrier = new CyclicBarrier(THREAD_COUNT, () -> System.out.println("所有线程到达屏障点")); public static void main(String[] args) { ExecutorService executor = Executors.newFixedThreadPool(THREAD_COUNT); for (int i = 0; i < THREAD_COUNT; i++) { executor.execute(() -> { try { System.out.println(Thread.currentThread().getName() + " 开始工作"); Thread.sleep((long)(Math.random() * 2000)); System.out.println(Thread.currentThread().getName() + " 到达屏障"); barrier.await(); System.out.println(Thread.currentThread().getName() + " 继续执行"); } catch (Exception e) { e.printStackTrace(); } }); } executor.shutdown(); } } ``` #### 三、分阶段任务实现(最佳实践) ```java public class PhaseTaskDemo { private static final int PHASE_COUNT = 3; private static final int WORKER_COUNT = 4; private static final CyclicBarrier barrier = new CyclicBarrier(WORKER_COUNT, new PhaseReporter()); static class PhaseReporter implements Runnable { private int phase = 1; @Override public void run() { System.out.printf("=== 第%d阶段完成 ===%n", phase++); if(phase > PHASE_COUNT) { System.out.println("所有阶段任务已完成"); } } } public static void main(String[] args) { ExecutorService executor = Executors.newCachedThreadPool(); for (int i = 0; i < WORKER_COUNT; i++) { executor.execute(() -> { try { for (int phase = 1; phase <= PHASE_COUNT; phase++) { doWork(phase); barrier.await(); } } catch (Exception e) { handleException(e); } }); } executor.shutdown(); } private static void doWork(int phase) throws InterruptedException { System.out.printf("%s 正在执行阶段%d任务%n", Thread.currentThread().getName(), phase); Thread.sleep(500 + (long)(Math.random() * 1000)); } private static void handleException(Exception e) { if (e instanceof BrokenBarrierException) { System.out.println("屏障已损坏,需要重置"); } else if (e instanceof InterruptedException) { Thread.currentThread().interrupt(); } } } ``` #### 四、最佳实践要点 1. **参数设置规范** - 线程池大小应与屏障容量匹配(推荐使用 `newFixedThreadPool`) - 合理设置超时时间:`barrier.await(5, TimeUnit.SECONDS)` 2. **异常处理机制** ```java try { barrier.await(); } catch (BrokenBarrierException e) { System.out.println("检测到屏障损坏,执行重置操作"); barrier.reset(); // 重置屏障状态[^5] } catch (InterruptedException e) { Thread.currentThread().interrupt(); } ``` 3. **重置策略** - 调用 `reset()` 方法后: - 已到达的线程会收到 `BrokenBarrierException` - 屏障恢复初始状态 - 建议配合异常检测进行自动重置 4. **复合使用场景** - 与 `CountDownLatch` 配合实现复杂同步逻辑 - 结合 `Semaphore` 控制资源访问量 #### 五、典型应用场景 1. 多阶段数据加载(如游戏资源预加载) 2. 分布式计算任务汇总 3. 批量操作验证(如银行对账系统) 4. 模拟测试(压力测试中的并发控制)[^2][^4] #### 六、注意事项 1. 避免在回调方法中执行耗时操作(会阻塞线程恢复) 2. 不要超过设置的最大等待线程数 3. 推荐使用带超时的 `await` 方法防止死锁 4. 线程中断处理需重置屏障[^5]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值