CountDownLatch

在java.util.concurrenct这个包下面有很多工具,其中CountDownLatch是一个非常重要的工具类。对于这个类,本文来带大家学习一下。

我们从CountDownLatch这个类的名字就能知道,这个是一个倒计时锁,就是什么意思呢? 加入说:我在门上了一把锁,这个锁设定一个数,每达成一个条件则减一,直到这个数字减到了零,则锁打开,可以进入到门里面(程序可以继续执行)。

加锁可以用CountDownLatch.await()方法;减一操作可以用latch.countDown()方法。

闲言碎语不要讲,上代码。

package person.qzq.mutithread.countdownlatch;import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;@Slf4j  //这个注释是lombok的注释,请引入lombok包
public class CountDownLatchStudy {public static final int CHANGE_ROUND = 5;public static final int MATCH_ROUND = 6;public static final int TEAM_NUM = 2;public static final String TEAM1 = "AFC Ajax";public static final String TEAM2 = "Machester United";public static final String[] PLAYSINTEAM1 = {"Bertrand Traore", "Frenkie de Jong", "Donny van de Beek", "Davy Klaassen", "Davinson Sanchez", "Joel Veltman"};public static final String[] PLAYSINTEAM2 = {"Wayne Rooney", "Paul Pogba", "Michael Carrick", "Chris Smalling", "Luis Antonio Valencia Mosquera", "Marcos Rojo", "Ander Herrera"};/*** @param args*/public static void main(String[] args) {//设定每次只有一个队员进行主罚ExecutorService executorService = Executors.newFixedThreadPool(1);//当两队十名队员主罚点球之后,进入到规则改变的下一轮CountDownLatch latch = new CountDownLatch(CHANGE_ROUND * TEAM_NUM);for(int i = 0; i < CHANGE_ROUND; i++){executorService.execute(new Worker(TEAM1, PLAYSINTEAM1[i], latch, i));executorService.execute(new Worker(TEAM2, PLAYSINTEAM2[i], latch, i));}try {//一直阻塞,直到两队十名队员点球主罚完毕latch.await();log.info("The team who missed will immediately lose the game after five rounds");} catch (InterruptedException e) {log.error(e.getMessage(), e);}latch = new CountDownLatch((MATCH_ROUND - CHANGE_ROUND) * TEAM_NUM);for(int i = CHANGE_ROUND; i < MATCH_ROUND; i++){executorService.execute(new Worker(TEAM1, PLAYSINTEAM1[i], latch, i));executorService.execute(new Worker(TEAM2, PLAYSINTEAM2[i], latch, i));}try {//主线程阻塞,直到比赛分出胜负latch.await();log.info("The game is over. The winner is {}! Congratuation!!", TEAM2);} catch (InterruptedException e) {log.error(e.getMessage(), e);}executorService.shutdown();}
}@Slf4j
@RequiredArgsConstructor
class Worker implements Runnable{private final String teamName;private final String workerName;private final CountDownLatch latch;private final long index;@Overridepublic void run() {log.info("{}-{}-{}:\"I am penalty kicker.\"", teamName, workerName, index);try {log.info("{}-{}-{}:\"I am thinking which direction to shoot at.\"", teamName, workerName, index);//越到后来主罚点球的队员思考时间越长,压力很大Thread.sleep(index*1000);log.info("{}-{}-{}:\"OK. Decided\"", teamName, workerName, index);if(index >= CountDownLatchStudy.CHANGE_ROUND && teamName.compareTo(CountDownLatchStudy.TEAM1) == 0){//设定阿贾克斯的第六名队员射失点球,有点黑哨的嫌疑log.info("{}-{}-{}:\"Oh. No! I missed\"", teamName, workerName, index);}else {log.info("{}-{}-{}:\"Goal!Goal!Goal!Alei!Alei!Alei!\"", teamName, workerName, index);}} catch (InterruptedException e) {log.error(e.getMessage(), e);} finally{//主罚完毕,计数器减一latch.countDown();  }}
}

执行结果

17:24:06.789 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - AFC Ajax-Bertrand Traore-0:"I am penalty kicker."
17:24:06.789 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - AFC Ajax-Bertrand Traore-0:"I am thinking which direction to shoot at."
17:24:06.789 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - AFC Ajax-Bertrand Traore-0:"OK. Decided"
17:24:06.789 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - AFC Ajax-Bertrand Traore-0:"Goal!Goal!Goal!Alei!Alei!Alei!"
17:24:06.789 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - Machester United-Wayne Rooney-0:"I am penalty kicker."
17:24:06.789 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - Machester United-Wayne Rooney-0:"I am thinking which direction to shoot at."
17:24:06.789 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - Machester United-Wayne Rooney-0:"OK. Decided"
17:24:06.789 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - Machester United-Wayne Rooney-0:"Goal!Goal!Goal!Alei!Alei!Alei!"
17:24:06.789 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - AFC Ajax-Frenkie de Jong-1:"I am penalty kicker."
17:24:06.789 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - AFC Ajax-Frenkie de Jong-1:"I am thinking which direction to shoot at."
17:24:07.780 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - AFC Ajax-Frenkie de Jong-1:"OK. Decided"
17:24:07.780 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - AFC Ajax-Frenkie de Jong-1:"Goal!Goal!Goal!Alei!Alei!Alei!"
17:24:07.780 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - Machester United-Paul Pogba-1:"I am penalty kicker."
17:24:07.780 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - Machester United-Paul Pogba-1:"I am thinking which direction to shoot at."
17:24:08.781 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - Machester United-Paul Pogba-1:"OK. Decided"
17:24:08.781 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - Machester United-Paul Pogba-1:"Goal!Goal!Goal!Alei!Alei!Alei!"
17:24:08.781 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - AFC Ajax-Donny van de Beek-2:"I am penalty kicker."
17:24:08.781 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - AFC Ajax-Donny van de Beek-2:"I am thinking which direction to shoot at."
17:24:10.781 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - AFC Ajax-Donny van de Beek-2:"OK. Decided"
17:24:10.781 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - AFC Ajax-Donny van de Beek-2:"Goal!Goal!Goal!Alei!Alei!Alei!"
17:24:10.782 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - Machester United-Michael Carrick-2:"I am penalty kicker."
17:24:10.782 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - Machester United-Michael Carrick-2:"I am thinking which direction to shoot at."
17:24:12.782 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - Machester United-Michael Carrick-2:"OK. Decided"
17:24:12.783 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - Machester United-Michael Carrick-2:"Goal!Goal!Goal!Alei!Alei!Alei!"
17:24:12.783 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - AFC Ajax-Davy Klaassen-3:"I am penalty kicker."
17:24:12.783 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - AFC Ajax-Davy Klaassen-3:"I am thinking which direction to shoot at."
17:24:15.783 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - AFC Ajax-Davy Klaassen-3:"OK. Decided"
17:24:15.783 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - AFC Ajax-Davy Klaassen-3:"Goal!Goal!Goal!Alei!Alei!Alei!"
17:24:15.784 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - Machester United-Chris Smalling-3:"I am penalty kicker."
17:24:15.784 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - Machester United-Chris Smalling-3:"I am thinking which direction to shoot at."
17:24:18.791 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - Machester United-Chris Smalling-3:"OK. Decided"
17:24:18.791 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - Machester United-Chris Smalling-3:"Goal!Goal!Goal!Alei!Alei!Alei!"
17:24:18.792 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - AFC Ajax-Davinson Sanchez-4:"I am penalty kicker."
17:24:18.792 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - AFC Ajax-Davinson Sanchez-4:"I am thinking which direction to shoot at."
17:24:22.798 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - AFC Ajax-Davinson Sanchez-4:"OK. Decided"
17:24:22.798 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - AFC Ajax-Davinson Sanchez-4:"Goal!Goal!Goal!Alei!Alei!Alei!"
17:24:22.798 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - Machester United-Luis Antonio Valencia Mosquera-4:"I am penalty kicker."
17:24:22.799 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - Machester United-Luis Antonio Valencia Mosquera-4:"I am thinking which direction to shoot at."
17:24:26.799 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - Machester United-Luis Antonio Valencia Mosquera-4:"OK. Decided"
17:24:26.799 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - Machester United-Luis Antonio Valencia Mosquera-4:"Goal!Goal!Goal!Alei!Alei!Alei!"
17:24:26.799 [main] INFO person.qzq.mutithread.countdownlatch.CountDownLatchStudy - The team who missed will immediately lose the game after five rounds
17:24:26.799 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - AFC Ajax-Joel Veltman-5:"I am penalty kicker."
17:24:26.799 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - AFC Ajax-Joel Veltman-5:"I am thinking which direction to shoot at."
17:24:31.800 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - AFC Ajax-Joel Veltman-5:"OK. Decided"
17:24:31.800 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - AFC Ajax-Joel Veltman-5:"Oh. No! I missed"
17:24:31.800 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - Machester United-Marcos Rojo-5:"I am penalty kicker."
17:24:31.800 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - Machester United-Marcos Rojo-5:"I am thinking which direction to shoot at."
17:24:36.801 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - Machester United-Marcos Rojo-5:"OK. Decided"
17:24:36.801 [pool-1-thread-1] INFO person.qzq.mutithread.countdownlatch.Worker - Machester United-Marcos Rojo-5:"Goal!Goal!Goal!Alei!Alei!Alei!"
17:24:36.801 [main] INFO person.qzq.mutithread.countdownlatch.CountDownLatchStudy - The game is over. The winner is Machester United! Congratuation!!

代码说明:
这个模拟了足球的点球大战程序,马上不久就要进行欧联杯决赛了,对阵双方是曼联和阿贾克斯两只球队。点球大战的规则是:双方互射5轮点球,如果双方分出胜负,则终止比赛;如果双方射中的数字一致,则进入下一轮,如果有一方射失点球,而另一方射中,则比赛立刻终止。

程序中,在第五轮点球互射完成后,双方比分一致。则打印出进入规则转换的第六轮的日志;这时计数器已经随着比赛的进行,十名球员已经踢完,第一个计数器解锁成功,继续往下执行。

进入第六轮之后,阿贾克斯球员罚失点球,曼联球员罚进点球,第二个计数器解锁成功,打印出获胜方是曼联,恭喜他们的日志。

CountDownLatch相关推荐

  1. Java并发编程之CountDownLatch、CyclicBarrier和Semaphore

    前言 本文为对CountDownLatch.CyclicBarrier.Semaphore的整理使用 CountDownLatch CountDownLatch类位于java.util.concurr ...

  2. java并发之同步辅助类CyclicBarrier和CountDownLatch

    CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier).它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门, ...

  3. java 并发统计_java并发编程|CountDownLatch计数器

    0x01,CountDownLatch介绍 CountDownLatch是一个计数器,作为java并发编程中三个组件之一,这个组件的使用频率还是很多的.这里分享下自己画的java并发编程组件的图,后面 ...

  4. JAVA中的并发工具 -- CountDownLatch、CyclicBarrier、Semaphore

    2019独角兽企业重金招聘Python工程师标准>>> CountDownLatch CountDownLatch允许一个或多个线程等待其他线程完成操作. CountDownLatc ...

  5. Java常用多线程辅助工具---countdownLatch

    为什么80%的码农都做不了架构师?>>> 前言 上一篇博文说到semaphore,一个加强版的synchronized,该多线程辅助工具适用于控制对资源操作或者访问的场景.现在有一张 ...

  6. 一文搞懂 CountDownLatch 用法和源码!

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! CountDownLatch 是多线程控制的一种工具,它被 ...

  7. CountDownLatch的实现分析

    CountDownLatch CountdownLatch 是 JDK 并发包中提供的并发工具类,其允许一个或多个线程等待其他线程完成操作.常用作将一个任务拆分成多个子任务同时执行,只有子任务都执行完 ...

  8. LeetCode 1195. Fizz Buzz Multithreaded--并发系列题目--Java 解法--AtomicInteger/CountDownLatch/CyclicBarrier

    题目地址:Fizz Buzz Multithreaded - LeetCode Write a program that outputs the string representation of nu ...

  9. CycliBarriar和CountdownLatch(计数器)

    CyclicBarrier可以重复使用,而CountdownLatch不能重复使用. countDownLatch这个类使一个线程等待其他线程各自执行完毕再执行. 是通过一个计数器来实现的,计数器的初 ...

  10. Redisson 分布式锁源码 11:Semaphore 和 CountDownLatch

    前言 Redisson 除了提供了分布式锁之外,还额外提供了同步组件,Semaphore 和 CountDownLatch. Semaphore 意思就是在分布式场景下,只有 3 个凭证,也就意味着同 ...

最新文章

  1. mvc存储Cookie和读取Cookie方法
  2. 3.Java集合-HashSet实现原理及源码分析
  3. thinkphp5的目录结构和命名规范
  4. 计算机成绩统计优秀率,基于决策树算法的成绩优秀率分析与研究.pdf
  5. 卷积神经网络Convolutional Neural Network (CNN)
  6. 2017年Q1安卓ROOT类恶意病毒发展趋势研究报告
  7. mysql 全文检索 教程_MySQL:详细说明MySQL全文检索图文详细教程
  8. jdkjmeter安装与环境变量配置
  9. 华为鸿蒙怎么体验,华为鸿蒙 HarmonyOS 2.0 发布,教你如何升级体验
  10. java referencemap_Java中关于WeakReference和WeakHashMap的理解
  11. 在线直播系统网站源码搭建一个点播跟直播流媒体服务器
  12. 获取浏览器的地理位置信息
  13. python设置颜色_使用python改变颜色的色调
  14. 【5G系列】一文打尽 IMSI、TMSI、GUTI、P-TMSI、S-TMSI、LMSI、5G-TMSI、5G-GUTI、5G-S-TMSI
  15. 用Windows电脑看epub小说,哪些阅读器软件更好用?
  16. 中秋佳节,我想给粉丝们送个礼物,真诚祝福(已送出,恭喜下面这位粉丝)
  17. “鸡血驱动”为CS:GO、LOL注入“强心剂”!英特尔锐炫A750显卡实测
  18. LightOJ - 1395
  19. 14.运算符(operator)
  20. 计算机系统盘涨满怎么办,电脑重装系统后C盘爆满?教你一招让空间大幅释放!-电脑c盘满了怎么办...

热门文章

  1. limbo运行veket linux,Veket Linux使用(非常适合老电脑的系统)
  2. 2004-6-6 0:03:43 死得其所
  3. 开源项目之Android繁体中文输入法
  4. 【数值模型系列】link_grib.csh脚本解读
  5. Android studio登陆注册的实现及介绍
  6. python3的fft_Python fft.fft方法代码示例
  7. 【机器学习】 随机森林(Random Forest)
  8. 360浏览器怎么导入html,如何将360浏览器收藏网页导入到火狐浏览器中
  9. Prometheus和它的xdm
  10. 【FXCG】美元指数对人民币汇率的影响