🔥【Java 干货】CyclicBarrier:多线程“集合点”神器!附完整代码+图解
💻 作为程序员,你是否遇到过这样的场景?
🎯 今天分享 Java 并发包中的 CyclicBarrier——线程“集合点”同步神器!
📌 核心特点
✅ 循环使用:可重复触发同步
✅ 自动重置:每次所有线程到达后自动重置
✅ 回调任务:支持在所有线程到齐后执行额外逻辑
🚀 完整代码示例
import java.util.concurrent.*;
public class CyclicBarrierDemo {
public static void main(String[] args) {
// 创建CyclicBarrier,3个线程参与,到达屏障时执行回调任务
CyclicBarrier barrier = new CyclicBarrier(3, () -> {
System.out.println("\n⭐️所有线程已集合完毕!开始下一阶段⭐️\n");
});
// 创建3个线程
for (int i = 1; i <= 3; i++) {
new Thread(new Task(barrier, "线程"+i)).start();
}
}
static class Task implements Runnable {
private final CyclicBarrier barrier;
private final String name;
public Task(CyclicBarrier barrier, String name) {
this.barrier = barrier;
this.name = name;
}
@Override
public void run() {
try {
// 第一阶段
System.out.println(name + " 正在加载资源...");
Thread.sleep((long)(Math.random()*2000));
System.out.println(name + " 资源加载完成,等待其他线程");
barrier.await(); // 第一次集合点
// 第二阶段
System.out.println(name + " 正在处理数据...");
Thread.sleep((long)(Math.random()*2000));
System.out.println(name + " 数据处理完成,等待其他线程");
barrier.await(); // 第二次集合点(会再次触发回调!)
System.out.println(name + " 所有任务完成!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
复制代码
🖥️ 程序输出(真实运行结果)
线程1 正在加载资源...
线程2 正在加载资源...
线程3 正在加载资源...
线程3 资源加载完成,等待其他线程
线程1 资源加载完成,等待其他线程
线程2 资源加载完成,等待其他线程
⭐️所有线程已集合完毕!开始下一阶段⭐️
线程2 正在处理数据...
线程1 正在处理数据...
线程3 正在处理数据...
线程1 数据处理完成,等待其他线程
线程3 数据处理完成,等待其他线程
线程2 数据处理完成,等待其他线程
⭐️所有线程已集合完毕!开始下一阶段⭐️
线程2 所有任务完成!
线程3 所有任务完成!
线程1 所有任务完成!
复制代码
🎯 关键图解
1️⃣ 第一次同步:
[线程1] ──加载完成─→ 🚦
[线程2] ──加载完成─→ 🚦
[线程3] ──加载完成─→ 🚦
⬇️
🔥 回调任务触发!
⬇️
[所有线程] 同时进入数据处理阶段
复制代码
2️⃣ 第二次同步:
[线程1] ──处理完成─→ 🚦
[线程2] ──处理完成─→ 🚦
[线程3] ──处理完成─→ 🚦
⬇️
🔥 回调任务再次触发!
⬇️
[所有线程] 任务结束
复制代码
💡 使用场景
✔️ 多阶段并行计算(如:游戏加载资源→处理数据→渲染画面)
✔️ 压力测试时模拟并发请求
✔️ 分布式任务分片处理
🚨 注意事项
线程数必须和 CyclicBarrier 的 parties 参数一致
可用await(5, TimeUnit.SECONDS)
设置超时
如果线程被中断,会抛出 BrokenBarrierException
👨💻 讨论:你在项目中用过 CyclicBarrier 吗?欢迎评论区交流!
🔖 #Java #多线程 #并发编程 #程序员 #代码分享
👉 点赞收藏,下次面试官问到 CyclicBarrier,直接甩这篇!
评论