CountDownLatch 是线程协作中的并发流程控制的工具类,它能在多线程场景中,可以让多个线程执行完自己的任务后,在某个等待点集合,集合完毕后,再继续等待点后面的工作,如图

图上有5个蓝色的勇士,每个勇士需要到每扇门寻找钥匙后,就可以在关闭橙色公主的门前等待,直到所有勇士拿到所有钥匙,来开锁才能救出公主。救出公主的关键是必须有5把钥匙

其中一勇士调用了 CounDownLatch.count() 拿到了锁

勇士拿到锁后打开了一把锁

其它勇士也陆续拿到锁并打开锁了


最终救出了公主,因为满足了CountDownLatch.await() 的条件

5勇士救出了公主,这场景想想就觉得感动

代码演示

public class CountDownLatchDemo {static CountDownLatch countDownLatch = new CountDownLatch(5);public static void main(String[] args) {for (int i = 1; i < 6; ++i) {new Thread(new Task(), "勇士" + i).start();}try {System.out.println("等待勇士的搭救...");countDownLatch.await();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("勇士都到达,锁已全部打开,成功救出了公主,感动!!");}static class Task implements Runnable {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + "拿到了钥匙");countDownLatch.countDown();System.out.println(Thread.currentThread().getName() + "开了锁");}}
}


上面的图所说的,拿到锁,其实是调用 CountDownLatch.countDown(),使得 CountDownLatch 类中的 count 变量减1,count 的初始值是创建对象的时候,传进去的参数值。

当 count减为0的时候,就满足 CountDownLatch.await() 的条件,所有等待在这个点的任务,都会继续执行下去

构造器方法

CountDownLatch(int count)

CountDownLatch类只提供了一个构造器,并没有其它构造器了,它所传入的参数,代表着你在到达 await()方法的地方的时候,其它地方需要调用多少次 countDown()方法的次数

 public CountDownLatch(int count) {if (count < 0) throw new IllegalArgumentException("count < 0");this.sync = new Sync(count);}

从源码我们可以看到,传入的参数不能小于0,当小于0的时候,会抛出 IllegalArgumentException异常

等待方法

void await() throws InterruptedException boolean await(long timeout, TimeUnit unit)throws InterruptedException

第一个方法,当调用这个方法的时候,所有线程都会阻塞在这个点,当其它操作触及调用 countDown()方法,使得 count为0的时候,其它阻塞在这里的任务都会继续执行下去

第二个方法,在上面的基础上,加上了超时时间,这里的是等待其它任务在规定超时时间调用 countDown(),如果没有在超时时间内调用,则不阻塞其任务,直接放行任务,让任务继续执行下去

获取当前 count的数量

long getCount()

调用这个方法,可以知道现在count的值,从而知道还需要调用多少次 countDown()方法,从能满足 await()的条件

释放门闩

void countDown()

调用这个方法,可以让 count减1


:当 count的值为0的时候,这时候无论有多少个任务执行到这个地方,都不会被阻塞了,因为 CountDownLatch只能用一次,而它的 count的值,不能被重置,跟 CyclicBarrier 有所区别


欢迎大家关注下个人的「公众号」:独醉贪欢

CountDownLatch的用法,配图版相关推荐

  1. CountDownLatch/CyclicBarrie用法记录

    在jdk1.5中,java提供了很多工具类帮助我们进行并发编程,其中就有CountDownLatch和CyclicBarrie 1.CountDownLatch的用法 CountDownLatch 位 ...

  2. 2021投资大复盘】上个月年化收益50%,这个月到今天54%了,也在今天封盘了,来年我们再战江湖【配图版】

    之前我复盘了年收益50%的部分,很高兴得到了老虎的热推,2021年工作压力超级大,再加上今天听说恒大出事了,加上美联储加息与否不太确定,今年准备封盘了. (1)50%的由来: 2021年2月份- 11 ...

  3. java并发包CountDownLatch的用法

    public static void main(String[] args) {// countDownLatch初始化 ,其功能类似于计数器.. /*常见的应用场景: 某个线程必须等待其他的线程执行 ...

  4. CyclicBarrier和CountDownLatch的用法与区别

    前言 CyclicBarrier和CountDownLatch这两个工具都是在java.util.concurrent包下,并且平时很多场景都会使用到. 本文将会对两者进行分析,记录他们的用法和区别. ...

  5. 2021最新Unity的jdk SE8(1.8.0 )的安装及环境配置 超级详细配图版

    ①安装jdk1.8.0 ①安装jdk1.8.0 我看大部分的博文都说直接去Java官网就行 但是我去官网发现jdk se8下载要登录,太麻烦了. 资源分享:提取码pcyx 下载完成后启动. 点击下一步 ...

  6. 数据降维1:主成分分析法思想及原理(配图版)

    0x01 什么是主成分分析法 PCA(Principal Component Analysis),即主成分分析方法,是一种使用最广泛的数据降维算法(非监督的机器学习方法). 其最主要的用途在于&quo ...

  7. 爆笑造句狂潮 雷人语录合集配图版

    今儿下午,同事不知从哪儿转来一链接,全办公室开始集体疯玩,其实很简单的造句游戏,没想到能玩儿成这么爆笑又雷人的结果来~~~特此总结个语录出来,这可才一天的成果呢!! 先看看标准句型!!We are o ...

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

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

  9. CountDownLatch 用法和源码解析

    CountDownLatch 是多线程控制的一种工具,它被称为 门阀. 计数器或者 闭锁.这个工具经常用来用来协调多个线程之间的同步,或者说起到线程之间的通信(而不是用作互斥的作用).下面我们就来一起 ...

最新文章

  1. java 简单 语言_将简单的表达式语言放入java中
  2. 物联网通信协议全解析
  3. Spring中Bean的后置处理器
  4. 最近工程师怎么都在写公众号?这玩意到底能赚多少钱?
  5. android 自定义baseadapter listview,android之ListView和BaseAdapter的组合使用
  6. UVA - 101:The Blocks Problem
  7. ES6(一)——字面量的增强、解构、let/const、块级作用域、暂时性死区
  8. c语言作业的分析,C语言作业分析.doc
  9. 营业执照psd模板2020_荣誉证书聘书奖状模板,CFR矢量素材PSD源文件,700张精美套用...
  10. html鼠标滑过带音效,HTML5带音效的交互式日食动画
  11. 重写需要注意哪些方面?
  12. 4款最受欢迎的Mac原型工具
  13. 男生追女生的方法有哪些?
  14. yarn install报错及解决办法
  15. MATLAB中把Excel数据矩阵化,excel将表格数据矩阵-MATLAB怎么读取EXCEL中矩阵形式的数据,并存放在一......
  16. postman 安装失败 Failed to install the .NET Framework, try installingthe latest version manully
  17. 在vant组件下阻止手机自带键盘弹起
  18. Tuscany SCA软件架构设计理念分析鉴赏 (一)
  19. jQuery 实现音乐导航案例
  20. linux如何设置mac快捷键,Mac与Linux常用快捷键汇总

热门文章

  1. 2020A证(安全员)实操考试视频及A证(安全员)操作证考试
  2. 45+%录用率! ICASSP截稿延期, CV| NLP| 语音均可投, CCF B
  3. 【论文研读】-DiPETrans: A Framework for Distributed Parallel Execution of Transactions of Blocks in BLC
  4. 数据结构——单循环链表的
  5. 亲测,openxlpy和xlrd 统计excel的总行数,删除最后几行,再统计的话,还是原来的行数
  6. 如《老人与海》般孤勇【极学】
  7. 贪食蛇java源码_JAVA 贪食蛇 源码
  8. 查论文、期刊的排名等的方法
  9. 【VUE】字符串截取,数字截取
  10. sina网页新闻小偷原理及源代码(java版)