countdownlatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完毕再执行。从命名可以解读到countdown是倒数的意思,类似于我们倒计时的概念

countdownlatch提供了两个方法,一个是countDown,一个是await, countdownlatch初始化的时候需要传入一个整数,在这个整数倒数到0之前,调用了await方法的程序都必须要等待,然后通过countDown来倒数。

使用案例

public static void main(String[] args) throws InterruptedException { CountDownLatch countDownLatch=new CountDownLatch(3); new Thread(()->{ System.out.println(""+Thread.currentThread().getName()+"-执行中"); countDownLatch.countDown(); System.out.println(""+Thread.currentThread().getName()+"-执行完毕"); },"t1").start(); new Thread(()->{ System.out.println(""+Thread.currentThread().getName()+"-执行中"); countDownLatch.countDown(); System.out.println(""+Thread.currentThread().getName()+"-执行完毕"); },"t2").start(); new Thread(()->{ System.out.println(""+Thread.currentThread().getName()+"-执行中"); countDownLatch.countDown();System.out.println(""+Thread.currentThread().getName()+"-执行完毕"); },"t3").start(); countDownLatch.await(); System.out.println("所有线程执行完毕");
} 

从代码的实现来看,有点类似join的功能,但是比join更加灵活。CountDownLatch构造函数会接收一个int类型的参数作为计数器的初始值,当调用CountDownLatch的countDown方法时,这个计数器就会减一。

通过await方法去阻塞去阻塞主流程

模拟高并发场景

static CountDownLatch countDownLatch=new CountDownLatch(1);
@Override
public void run() { try { countDownLatch.await(); //TODO } catch (InterruptedException e){ e.printStackTrace(); } System.out.println("ThreadName:"+Thread.currentThread().getName());
} 
public static void main(String[] args) throws InterruptedException { for(int i=0;i<1000;i++){ new Demo().start(); } countDownLatch.countDown();
}

总的来说,凡事涉及到需要指定某个人物在执行之前,要等到前置人物执行完毕之后才执行的场景,都可以使用CountDownLatch

Condition总结-CountDownLatch相关推荐

  1. Condition总结-CountDownLatch源码分析

    对于 CountDownLatch,我们仅仅需要关心两个方法,一个是 countDown() 方法,另一个是 await() 方法. countDown() 方法每次调用都会将 state 减 1,直 ...

  2. java高并发(十三)并发容器J.U.C--AQS

    AbstractQueueSynchronizer (AQS) J.U.C 大大提高了java并发的性能,而AQS则是J.U.C的核心. AQS底层使用双向列表(队列的一种实现). 使用Node实现F ...

  3. Java多线程(五) —— 线程并发库之锁机制

    参考文献: http://www.blogjava.net/xylz/archive/2010/07/08/325587.html 一.Lock与ReentrantLock 前面的章节主要谈谈原子操作 ...

  4. 读Java并发编程实践记录_原子性_锁_同步容器详解_任务执行

    原子性: 单独的,不可分割的操作 不要使用过期状态值来决策当下的状态, 一定要先检查再执行(不检查, 将引发数据修改,丢失) 避免延迟初始化(懒加载: 先查看对象 == null, 然后new), 有 ...

  5. 《面筋:拿到美团点评和去哪儿网的offer》

    <面筋:拿到美团点评和去哪儿网的offer> 前言 从9月25号下午面完百度之后,就结束了自己的找工作旅程.就这样浪了20来天,想想还是写篇面筋吧,可能会对学弟学妹有一点点帮助. 自我介绍 ...

  6. 3万字英国留学生Java后台面经,中offer率5/7 精

    https://www.nowcoder.com/discuss/149285?type=11&order=0&pos=13&page=1 作者:Redfisky 链接:htt ...

  7. 【BATJ面试必会】JAVA面试到底需要掌握什么?【下】

    [BATJ面试必会]JAVA面试到底需要掌握什么?[下] 非对称加密,对称加密 对称加密(Symmetric Cryptography),又称私钥加密 对称加密是最快速.最简单的一种加密方式,加密(e ...

  8. Java,该学什么?

    本人大学学的是生物技术专业,毕业后入坑Java. 最近有人问我是如何转行的,需要学一些什么.我在网上看到一篇帖子,觉得写得很全.如果是我来写,可能还写不了这么全的.在此分享给网友. 2019秋招几个月 ...

  9. Java学到什么程度才能叫精通?

    Java学到什么程度才能叫精通? 全文分为:基础知识和进阶知识 下文java必会知识附答案!并为大家整理了一个pdf,所有的知识点和答案都在pdf里面. 必会知识点及其答案!!! Java基础知识(* ...

最新文章

  1. 要懂得利用和筛选友情链接
  2. LeetCode Linked List Cycle
  3. springboot设置静态资源不拦截的方法
  4. FUN ALV TOOLBAR 增加自定义按钮
  5. unity中实现简单对象池,附教程原理
  6. 布隆过滤算法c语言,通过实例解析布隆过滤器工作原理及实例
  7. 继承BaseAdapter自定义ListView
  8. mysql TIMESTAMP 报错
  9. CentOS 7安装 MySQL 8 数据库
  10. Elasticsearch6.3.0环境安装
  11. SQLyog使用技巧
  12. IE浏览器右下角小广告怎么去除
  13. PreparedStatement使用
  14. Vue实现excel文件下载
  15. 移动支付服务商加盟/微信支付宝扫码支付代理加盟
  16. java面试模拟场景,迈向高级的Java面试突围课
  17. r语言做断轴_手把手教你用R语言做回归后的残差分析
  18. Docker 常用命令收录 -- 持续更新
  19. 关于哈密顿路是否存在的遍历算法
  20. 什么是android SDK和API

热门文章

  1. Android 笔记一
  2. oauth2.0里回调地址返回code中如何让code不显示在URL里?
  3. 给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。
  4. Java、Apache Tomcat下载与安装及环境变量配置
  5. hadoop 启动or运行mr错误
  6. Oracle中的正则表达式(REPLACE 和REGEXP_REPLACE)---转载自http://database.51cto.com/art/201009/228270.htm...
  7. 错误提示之:已超过传入消息(65536)的最大消息大小配额。若要增加配额,请使用相应绑定元素上的 MaxReceivedMessageSize 属性...
  8. java开发微信二维码
  9. 网上商城首页实现总结(一)
  10. 微信小程序自定义组件实现