news 2026/6/25 14:39:32

Java CountDownLatch 代码示例:协调多个线程的执行顺序(比赛起跑)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java CountDownLatch 代码示例:协调多个线程的执行顺序(比赛起跑)

比赛起跑代码详解

代码回顾

importjava.util.concurrent.CountDownLatch;publicclassRaceDemo{publicstaticvoidmain(String[]args)throwsInterruptedException{intrunnerCount=4;CountDownLatchreadyLatch=newCountDownLatch(runnerCount);CountDownLatchstartLatch=newCountDownLatch(1);CountDownLatchfinishLatch=newCountDownLatch(runnerCount);// 运动员线程for(inti=1;i<=runnerCount;i++){intrunnerId=i;newThread(()->{try{// 1. 准备就绪Thread.sleep((long)(Math.random()*1000));System.out.println("运动员"+runnerId+" 准备就绪");readyLatch.countDown();// 2. 等待发令枪响startLatch.await();System.out.println("运动员"+runnerId+" 起跑!");// 3. 跑步Thread.sleep((long)(Math.random()*3000));System.out.println("运动员"+runnerId+" 到达终点");}catch(InterruptedExceptione){e.printStackTrace();}finally{finishLatch.countDown();}}).start();}// 裁判线程readyLatch.await();// 等待所有运动员就绪System.out.println("\n所有运动员准备就绪,比赛开始!\n");Thread.sleep(1000);// 准备时间startLatch.countDown();// 发令枪响finishLatch.await();// 等待所有运动员完成System.out.println("\n比赛结束!");}}

三个 CountDownLatch 的作用

1.readyLatch (准备就绪信号)

CountDownLatchreadyLatch=newCountDownLatch(runnerCount);
  • 用途:确保所有运动员都准备好,裁判才能发令
  • 工作原理
    • 每个运动员准备完成后调用readyLatch.countDown()
    • 裁判调用readyLatch.await()等待所有运动员准备就绪

2.startLatch (发令枪信号)

CountDownLatchstartLatch=newCountDownLatch(1);
  • 用途:控制所有运动员同时起跑(公平性)
  • 工作原理
    • 初始化值为1,所有运动员都在startLatch.await()处等待
    • 裁判调用startLatch.countDown()后,所有等待的运动员同时开始执行

3.finishLatch (完成信号)

CountDownLatchfinishLatch=newCountDownLatch(runnerCount);
  • 用途:等待所有运动员完成比赛
  • 工作原理
    • 每个运动员到达终点后调用finishLatch.countDown()
    • 裁判调用finishLatch.await()等待比赛完全结束

执行流程详解

开始

创建4个运动员线程

运动员各自准备

所有运动员都准备就绪?

裁判宣布: 比赛开始

发令枪响 countDown

运动员同时起跑

运动员各自跑步

所有运动员都到达终点?

宣布比赛结束

阶段一:准备阶段(异步)

运动员1 准备就绪 (readyLatch: 3) 运动员2 准备就绪 (readyLatch: 2) 运动员3 准备就绪 (readyLatch: 1) 运动员4 准备就绪 (readyLatch: 0) → 裁判继续执行

阶段二:起跑阶段(同步)

裁判: 所有运动员准备就绪,比赛开始! 裁判: 准备时间1秒... 裁判: 发令枪响!(startLatch.countDown()) 所有运动员同时: 起跑!

阶段三:比赛阶段(异步)

运动员3 到达终点 (finishLatch: 3) 运动员1 到达终点 (finishLatch: 2) 运动员4 到达终点 (finishLatch: 1) 运动员2 到达终点 (finishLatch: 0) → 比赛结束

关键点解释

为什么用 startLatch(1)?

CountDownLatchstartLatch=newCountDownLatch(1);
  • 只需要一个信号(裁判开枪)就能释放所有等待的运动员
  • 确保绝对的公平:所有运动员在同一时刻收到起跑信号

时间随机性的作用

Thread.sleep((long)(Math.random()*1000));// 准备时间不同Thread.sleep((long)(Math.random()*3000));// 跑步速度不同
  • 模拟现实:运动员准备速度和跑步速度都不同
  • 可以看到:准备快的运动员不一定跑得最快

实际输出示例

运动员2 准备就绪 运动员1 准备就绪 运动员4 准备就绪 运动员3 准备就绪 所有运动员准备就绪,比赛开始! 运动员2 起跑! 运动员1 起跑! 运动员4 起跑! 运动员3 起跑! 运动员2 到达终点 运动员4 到达终点 运动员1 到达终点 运动员3 到达终点 比赛结束!

实际应用场景

这种模式适用于:

  1. 分布式系统启动:等待所有服务就绪后再对外提供服务
  2. 性能测试:准备多个压测线程,同时发起请求
  3. 游戏服务器:等待所有玩家加载完成后再开始游戏
  4. 数据计算:等待所有数据分片处理完成再汇总结果

扩展思考

如果要增加功能,比如:

  • 抢跑检测:可以在startLatch.await()前添加检查
  • 中途退赛:异常情况下也需要调用finishLatch.countDown()
  • 成绩排名:需要收集每个运动员的完成时间

这个示例完美展示了 CountDownLatch 如何协调多个线程的执行顺序,是并发编程中的经典模式。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/21 1:46:01

做好孩子视力守护者预防“小眼镜”秘籍在这里

如今&#xff0c;儿童青少年近视率持续攀升&#xff0c;“小眼镜”的出现不仅影响孩子的日常生活与学习&#xff0c;更可能对其长远健康发展构成隐患。作为家长&#xff0c;做好孩子视力的守护者&#xff0c;需掌握科学且系统的防控方法。一、近视高发&#xff1a;近距离用眼引…

作者头像 李华
网站建设 2026/6/24 19:49:27

Nginx 站点垂直扩容(单机性能升级)全攻略

核心&#xff1a;不改变架构、仅升级单台 Nginx 服务器的硬件 / 配置&#xff0c;快速提升并发承载能力&#xff0c;是流量初期增长的最优解&#xff0c;成本低、实施快&#xff0c;优先落地这一套即可解决大部分初期瓶颈。✅ 先明确&#xff1a;Nginx 单机瓶颈核心点Nginx 是事…

作者头像 李华
网站建设 2026/6/17 21:53:55

2026改一个越用越旺的昵称(收藏版)

&#x1f365;兜里藏金ᐝ࿐ 吸钞&#x1f4b8;体质拉满ཀོ࿐暴富锦鲤ꚸ附体Չᐝ࿐ᩚ ༄ᐝ财运爆棚ഒᩚ࿐&#x1f33c;᭄好运ꚸ超载Չᐝ࿐ᩚ ꪋꪆ꫁⁵⁰月薪百万꧔&#x1f380;᭄༣财神敲门&#x1f3e0;ଓꦿ࿐ &#x1f33c;᭄快乐ꚸ溢屏Չᐝ࿐ᩚꪋꪆ᭄好运&#x1f495;扎堆…

作者头像 李华
网站建设 2026/6/17 18:32:05

智慧医院新范式!东软与西安交通大学第一附属医院全面战略合作

近日&#xff0c;东软集团与西安交通大学第一附属医院共同签署战略合作协议。双方将围绕智慧医院、医工结合、医疗健康产业创新等方面&#xff0c;开启多维度、多层次的全面战略合作。这是双方二十余年稳定、互信合作中的又一里程碑式成果&#xff0c;标志着双方实现了从业务领…

作者头像 李华
网站建设 2026/6/17 11:45:27

开源推荐--RustDesk:基于Rust的远程桌面神器,彻底告别TeamViewer/AnyDesk!

摘要&#xff1a;在远程办公和运维日益普及的今天&#xff0c;TeamViewer和AnyDesk的商业检测和连接限制让许多用户感到头疼。本文将深入介绍一款基于Rust编写的开源远程桌面软件——RustDesk。它不仅轻量、安全&#xff0c;更支持自建服务器&#xff0c;让你完全掌控自己的数据…

作者头像 李华
网站建设 2026/6/13 8:27:51

三维EKF实现无人机高精度悬停控制

目录 1. 三维 EKF 设计 状态向量 状态方程&#xff08;预测&#xff09; 2. 观测方程&#xff08;更新&#xff09; GPS 观测矩阵&#xff1a; 光流观测矩阵&#xff1a; 气压计观测矩阵&#xff1a; 3. 代码实现&#xff08;STM32 HAL 库&#xff09; 4. 集成到无人机…

作者头像 李华