CountDownLatch的Demo

Posted love-yang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CountDownLatch的Demo相关的知识,希望对你有一定的参考价值。

 1 package com.tjy.concurrentTools;
 2 
 3 import java.util.Random;
 4 import java.util.concurrent.CountDownLatch;
 5 import java.util.concurrent.TimeUnit;
 6 
 7 /**
 8  * 该类要实现10个运动员都准备就绪后,裁判的发令枪后开始跑,使用CountDownLatch实现
 9  */
10 public class SportManRun {
11 
12     private static final int NUMBER = 10;
13     //10个运动员,这里计数10
14     private static CountDownLatch readyLatch = new CountDownLatch(NUMBER);
15     //发令枪只有1次
16     private static CountDownLatch startLatch = new CountDownLatch(1);
17 
18     public static void main(String[] args) {
19         //召唤10个远动员
20         for (int i = 0; i < NUMBER; i++) {
21             Thread runMan = new Thread(new RunningMan(readyLatch, startLatch, "第" + (i + 1) + "运动员"));
22             runMan.start();
23         }
24         try {
25             //等待所有远动员准备就绪
26             readyLatch.await();
27             System.out.println("所有运动员准备就绪了!等待裁判发令枪。。。");
28 
29         } catch (InterruptedException e) {
30             e.printStackTrace();
31         }
32         startLatch.countDown();
33 
34         System.out.println("砰!!!!!!");
35     }
36 
37     static class RunningMan implements Runnable {
38         private CountDownLatch readyLatch;
39         private CountDownLatch startLatch;
40         private String name;
41 
42         public RunningMan(CountDownLatch readyLatch, CountDownLatch startLatch, String name) {
43             this.name = name;
44             this.readyLatch = readyLatch;
45             this.startLatch = startLatch;
46         }
47 
48         @Override
49         public void run() {
50             int prepareTime = new Random().nextInt(6000);
51             System.out.println(name + "需要时间:" + prepareTime + "准备。。。");
52             try {
53                 Thread.sleep(prepareTime);
54             } catch (InterruptedException e) {
55                 e.printStackTrace();
56             }
57             readyLatch.countDown();
58             System.out.println(name + "准备完毕。。。");
59             try {
60                 startLatch.await();
61             } catch (InterruptedException e) {
62                 e.printStackTrace();
63             }
64             System.out.println("开跑!!!!");
65 
66         }
67     }
68 }

执行结果
第1运动员需要时间:4454准备。。。
第2运动员需要时间:1015准备。。。
第3运动员需要时间:5133准备。。。
第4运动员需要时间:2094准备。。。
第5运动员需要时间:4407准备。。。
第6运动员需要时间:2224准备。。。
第7运动员需要时间:1160准备。。。
第8运动员需要时间:4010准备。。。
第9运动员需要时间:5655准备。。。
第10运动员需要时间:1284准备。。。
第2运动员准备完毕。。。
第7运动员准备完毕。。。
第10运动员准备完毕。。。
第4运动员准备完毕。。。
第6运动员准备完毕。。。
第8运动员准备完毕。。。
第5运动员准备完毕。。。
第1运动员准备完毕。。。
第3运动员准备完毕。。。
第9运动员准备完毕。。。
所有运动员准备就绪了!等待裁判发令枪。。。
砰!!!!!!
开跑!!!!
开跑!!!!
开跑!!!!
开跑!!!!
开跑!!!!
开跑!!!!
开跑!!!!
开跑!!!!
开跑!!!!
开跑!!!!

Process finished with exit code 0

































以上是关于CountDownLatch的Demo的主要内容,如果未能解决你的问题,请参考以下文章

JavaSE--CountDownLatch & CyclicBarrier

深入剖析线程同步工具CountDownLatch原理

CountDownLatch源码分析

我该如何做模态对话框片段(代码在我关闭之前不会执行)

CountDownLatch和CyclicBarrier 傻傻的分不清?超长精美图文又来了

CountDownLatch工具类使用