您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 循环栅栏CyclicBarrier举例分析
## 一、CyclicBarrier概述
CyclicBarrier是Java并发包(java.util.concurrent)中的一个同步辅助类,允许一组线程相互等待,直到到达某个公共屏障点(common barrier point)。与CountDownLatch不同,CyclicBarrier具有以下特点:
- **可重用性**:屏障被触发后可重置使用
- **回调机制**:支持设置屏障触发时的回调任务
- **线程阻塞**:调用await()的线程会被阻塞直到达到指定数量
## 二、核心方法解析
```java
// 构造函数(指定参与线程数和屏障触发时的回调)
CyclicBarrier(int parties, Runnable barrierAction)
// 线程调用此方法后会被阻塞,直到足够数量的线程到达
int await() throws InterruptedException, BrokenBarrierException
// 带超时的await版本
int await(long timeout, TimeUnit unit)
throws InterruptedException, BrokenBarrierException, TimeoutException
假设我们需要处理一个大型数据集,分为三个阶段: 1. 数据加载阶段 2. 数据清洗阶段 3. 数据分析阶段
要求所有线程完成当前阶段后才能进入下一阶段。
public class DataProcessingTask implements Runnable {
private static final int THREAD_COUNT = 3;
private static CyclicBarrier barrier = new CyclicBarrier(THREAD_COUNT, () -> {
System.out.println("所有线程已完成当前阶段,准备进入下一阶段");
});
private final int threadId;
public DataProcessingTask(int id) {
this.threadId = id;
}
@Override
public void run() {
try {
// 阶段1:数据加载
System.out.println("线程"+threadId+"加载数据完成");
barrier.await();
// 阶段2:数据清洗
System.out.println("线程"+threadId+"清洗数据完成");
barrier.await();
// 阶段3:数据分析
System.out.println("线程"+threadId+"分析数据完成");
barrier.await();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
for (int i = 0; i < THREAD_COUNT; i++) {
new Thread(new DataProcessingTask(i)).start();
}
}
}
线程0加载数据完成
线程1加载数据完成
线程2加载数据完成
所有线程已完成当前阶段,准备进入下一阶段
线程2清洗数据完成
线程0清洗数据完成
线程1清洗数据完成
所有线程已完成当前阶段,准备进入下一阶段
线程1分析数据完成
线程0分析数据完成
线程2分析数据完成
所有线程已完成当前阶段,准备进入下一阶段
循环使用机制:
异常处理:
屏障动作执行:
场景 | CyclicBarrier | CountDownLatch |
---|---|---|
多阶段任务同步 | ✓ | ✗ |
一次性屏障 | ✓ | ✓ |
可重置计数器 | ✓ | ✗ |
主线程等待子线程完成 | ✗ | ✓ |
CyclicBarrier特别适用于需要多轮同步的并行计算场景,如MapReduce中的分阶段处理、多线程测试等场景。合理使用可以显著提高多线程协作的效率。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。