写点什么

Java 干货分享

作者:codemonkey
  • 2025-08-12
    四川
  • 本文字数:1649 字

    阅读完需:约 5 分钟

🔥【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] ──处理完成─→ 🚦             ⬇️       🔥 回调任务再次触发!             ⬇️  [所有线程] 任务结束  
复制代码



💡 使用场景

✔️ 多阶段并行计算(如:游戏加载资源→处理数据→渲染画面)


✔️ 压力测试时模拟并发请求


✔️ 分布式任务分片处理



🚨 注意事项

  1. 线程数必须和 CyclicBarrier 的 parties 参数一致

  2. 可用await(5, TimeUnit.SECONDS)设置超时

  3. 如果线程被中断,会抛出 BrokenBarrierException




👨💻 讨论:你在项目中用过 CyclicBarrier 吗?欢迎评论区交流!


🔖 #Java #多线程 #并发编程 #程序员 #代码分享


👉 点赞收藏,下次面试官问到 CyclicBarrier,直接甩这篇!


用户头像

codemonkey

关注

还未添加个人签名 2018-05-04 加入

还未添加个人简介

评论

发布
暂无评论
Java干货分享_#java_codemonkey_InfoQ写作社区