java并发编程之CountDownLatch


简介

CountDownLatch 犹如倒计时计数器,countDown()计数器建议1,当等于0时所有等待者任务开始进行,可用于实现 一对多的指令通知场景,例如运动员赛跑的场景

 1 public class MyThreadCountDownLatch {
 2     
 3     public static void main(String[] args) {
 4         ExecutorService threadPool = Executors.newCachedThreadPool();
 5         final CountDownLatch mainCdl = new CountDownLatch(1);//主裁判计数器(指令发射器)
 6         final CountDownLatch taskCdl = new CountDownLatch(3);//运动员计数器(结果反馈)
 7         for(int i=1;i<=3;i++){  //创建三个线程,模拟三个运动员
 8             Runnable task=new Runnable() {
 9                 
10                 @Override
11                 public void run() {
12                     try {
13                         String threadName=Thread.currentThread().getName();
14                         System.out.println("线程"+threadName +"准备接受指令");
15                         mainCdl.await();
16                         System.out.println("线程"+threadName +"收到指令");
17                         Thread.sleep((long) (Math.random()*10000));  //真实以实际业务代码准
18                         System.out.println("线程"+threadName +"回应处理结果");
19                         taskCdl.countDown();//子线程发送结果指令(子线程计数器减1)
20                     } catch (InterruptedException e) {
21                         e.printStackTrace();
22                     }
23                 }
24             };
25             threadPool.execute(task);  //启动线程
26         }
27         
28         try {
29             System.out.println("线程"+Thread.currentThread().getName() +"准备发送指令");
30             Thread.sleep((long) (Math.random()*10000));
31             mainCdl.countDown(); //主线发送信号(主线程计数器减1)
32             System.out.println("线程"+Thread.currentThread().getName() +"等待处理结果");
33             taskCdl.await();
34             System.out.println("线程"+Thread.currentThread().getName() +"收到处理结果");
35         } catch (InterruptedException e) {
36             e.printStackTrace();
37         }
38         threadPool.shutdown();
39         
40     }
41 
42 }