朝阳市网站建设_网站建设公司_云服务器_seo优化
2025/12/31 18:55:35 网站建设 项目流程

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()避免永久阻塞

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询