🔥【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,直接甩这篇!
评论