换能器件阻抗分析仪
2025/12/31 20:54:50
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("所有线程完成,主线程继续执行");}}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());}}}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比赛结束!");}}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("主线程继续执行");}}| 方法 | 说明 | 示例 |
|---|---|---|
CountDownLatch(int count) | 创建计数器 | new CountDownLatch(5) |
await() | 等待计数器归零 | latch.await() |
await(timeout, unit) | 带超时等待 | latch.await(3, TimeUnit.SECONDS) |
countDown() | 计数器减1 | latch.countDown() |
getCount() | 获取当前计数值 | latch.getCount() |
new CountDownLatch(N)- 创建N个任务的计数器latch.await()- 主线程等待latch.countDown()- 每个任务完成后调用countDown()必须放在finally中await()避免永久阻塞记住:一次性的,用完即弃,不能重置重用。