news 2026/4/16 16:01:28

Java CountDownLatch 代码示例及使用细节总结

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java CountDownLatch 代码示例及使用细节总结

CountDownLatch 极简入门示例

1. 基础使用示例

importjava.util.concurrent.CountDownLatch;publicclassSimpleCountDownLatchDemo{publicstaticvoidmain(String[]args)throwsInterruptedException{// 创建计数器,初始值为3CountDownLatchlatch=newCountDownLatch(3);// 创建3个线程for(inti=1;i<=3;i++){intthreadId=i;newThread(()->{try{Thread.sleep(threadId*1000L);System.out.println("线程"+threadId+" 完成任务");}catch(InterruptedExceptione){e.printStackTrace();}finally{// 计数器减1(必须执行)latch.countDown();}}).start();}// 主线程等待所有子线程完成System.out.println("主线程等待中...");latch.await();// 阻塞,直到计数器为0System.out.println("所有线程完成,主线程继续执行");}}

2. 带超时时间的示例

importjava.util.concurrent.CountDownLatch;importjava.util.concurrent.TimeUnit;publicclassTimeoutDemo{publicstaticvoidmain(String[]args)throwsInterruptedException{CountDownLatchlatch=newCountDownLatch(5);for(inti=1;i<=5;i++){newThread(()->{try{Thread.sleep(2000);// 每个线程执行2秒System.out.println(Thread.currentThread().getName()+" 完成");}finally{latch.countDown();}}).start();}// 最多等待3秒booleansuccess=latch.await(3,TimeUnit.SECONDS);if(success){System.out.println("✓ 所有任务在规定时间内完成");}else{System.out.println("✗ 等待超时,仍有任务未完成");System.out.println("剩余计数: "+latch.getCount());}}}

3. 实用场景示例:比赛起跑

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比赛结束!");}}

4. 最简单的单线程等待示例

importjava.util.concurrent.CountDownLatch;publicclassSimplestDemo{publicstaticvoidmain(String[]args)throwsInterruptedException{// 只有一个任务需要等待CountDownLatchlatch=newCountDownLatch(1);newThread(()->{try{Thread.sleep(2000);System.out.println("后台任务执行完成");}finally{latch.countDown();// 必须放在finally中}}).start();System.out.println("主线程等待中...");latch.await();System.out.println("主线程继续执行");}}

5. 常用方法速查表

方法说明示例
CountDownLatch(int count)创建计数器new CountDownLatch(5)
await()等待计数器归零latch.await()
await(timeout, unit)带超时等待latch.await(3, TimeUnit.SECONDS)
countDown()计数器减1latch.countDown()
getCount()获取当前计数值latch.getCount()

核心要点总结

  1. 初始化new CountDownLatch(N)- 创建N个任务的计数器
  2. 等待latch.await()- 主线程等待
  3. 完成latch.countDown()- 每个任务完成后调用
  4. 必须countDown()必须放在finally
  5. 建议:使用带超时的await()避免永久阻塞

记住:一次性的,用完即弃,不能重置重用。

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

YOLOv8脑机接口联动设想:视觉信号解码

YOLOv8与脑机接口的跨模态融合&#xff1a;从视觉感知到意图解码 在渐冻症患者试图伸手去拿水杯却无法动弹的瞬间&#xff0c;他的眼睛凝视着目标&#xff0c;大脑皮层中涌动着意图信号——如果能捕捉这一刻的“注视”与“意图”的交汇&#xff0c;是否就能让机器替他完成动作&…

作者头像 李华
网站建设 2026/4/15 14:51:52

R语言GPT代码修复全解析,掌握这6种模式轻松应对报错

第一章&#xff1a;R语言GPT代码调试辅助在现代数据分析流程中&#xff0c;R语言因其强大的统计计算与可视化能力被广泛使用。然而&#xff0c;复杂逻辑或数据结构错误常导致调试困难。结合GPT类人工智能工具&#xff0c;开发者可更高效地定位问题、生成修复建议&#xff0c;甚…

作者头像 李华
网站建设 2026/4/15 22:06:36

YOLOv8智慧零售无人店解决方案

YOLOv8智慧零售无人店解决方案 在便利店、商超和地铁站里&#xff0c;越来越多的“刷脸进店、拿了就走”无人商店悄然落地。这些看似简单的购物体验背后&#xff0c;是一整套复杂的视觉感知系统在实时运行——从你踏入门店那一刻起&#xff0c;摄像头就开始追踪你的每一个动作…

作者头像 李华
网站建设 2026/4/16 13:15:00

YOLOv8多GPU并行训练配置指南

YOLOv8多GPU并行训练配置指南 在当前计算机视觉技术高速发展的背景下&#xff0c;目标检测作为核心任务之一&#xff0c;已广泛应用于自动驾驶、智能监控和工业质检等关键领域。其中&#xff0c;YOLO&#xff08;You Only Look Once&#xff09;系列凭借其“单阶段、端到端”的…

作者头像 李华
网站建设 2026/4/12 19:06:41

【模型评估不再难】:R语言交叉验证常见错误及6大修复方案

第一章&#xff1a;R语言交叉验证的核心概念与重要性交叉验证是评估统计模型泛化能力的重要技术&#xff0c;尤其在R语言中被广泛应用于机器学习和数据建模领域。其核心思想是将数据集划分为多个子集&#xff0c;通过反复训练和验证来减少模型评估的偏差与方差&#xff0c;从而…

作者头像 李华
网站建设 2026/4/16 15:53:35

揭秘R语言与GPT协同调试:如何3步定位复杂代码错误

第一章&#xff1a;R语言与GPT协同调试的背景与意义在数据科学和统计分析领域&#xff0c;R语言因其强大的数据分析能力和丰富的可视化库而广受青睐。然而&#xff0c;面对复杂算法实现或语法错误时&#xff0c;开发者常需耗费大量时间查阅文档、调试代码。随着人工智能的发展&…

作者头像 李华