一、概述

CountDownLatch是什么?网上概念的描述太多了。其实个人理解,他就是--等待多线程计数器

即:在某线程中(主线程或其他分线程都可以)声明一个初始值为N的CountDownLatch计数器,然后等待多个子线程完成了相关操作后再继续向下执行。--当各子线程执行到相应的地方后使N-1,最后N=0时,线程不再等待,继续向下执行。

二、运用及场景

2.1、运用

  1. CountDownLatch latch = new CountDownLatch(N); //构造对象时候 需要传入参数N  即计数器值
  2. latch.await();//能够阻塞线程 直到调用N次latch.countDown() 方法才释放线程
  3. latch.countDown();//在多个子线程中调用 每次调用,N计数器值-1

2.2、场景

需要等待其他线程做完某动作后再继续执行后续操作(当前线程多异步操作完成后再向下执行)--或等待超时后继续执行。
例:每天0点同时备份前一天的数据表,即0点开启与备份表相同的线程数分别同时备份表,全部成功后返回true,失败后返回false

三、案例解析

3.1、描述一个案例:3个人在等公交,公交停下后,分别上车,找到座位后车才启动。

先创建一个值为3(nameList.length)的CountDownLatch计数器 → 启动3个子线程分别执行任务(之后,主线程陷入等待latch.await()) → 子线程执行后将计数器-1(latch.countDown()) → 计数器值为0后唤醒主线程继续向下执行

public static void main(String[] args) {try {Random random = new Random();//生成随机数类SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式System.out.println("现在是北京时间:"+df.format(new Date())+"======>公交车停车了!");String[] nameList = new String[]{"张三","李四","王五"};//假设此为在公交站台排队的人CountDownLatch latch = new CountDownLatch(nameList.length);//声明一个与人数相等的计数器for(String name : nameList){new Thread(new Runnable() {@Overridepublic void run() {try {System.out.println(name+"小老弟,上车了!===》"+df.format(new Date()));int s = random.nextInt(6);//生成0-6的随机数,用做等待秒数System.out.println(name+"小老弟,找座位需要===》"+s+"秒!");Thread.sleep(s*1000);//等待s秒System.out.println(name+"小老弟,找到座位了!===》"+df.format(new Date()));} catch (Exception e) {e.printStackTrace();} finally {latch.countDown();//计数器-1}}}).start();}latch.await();//等待System.out.println("现在是北京时间:"+df.format(new Date())+"======>公交车启动了!");} catch (InterruptedException e) {e.printStackTrace();}
}

结果:

3.2、描述一个案例:3个人在等公交,公交停下后分别上车,待2人找到位置后,或2秒之后,公交启动。

先创建一个值为2的CountDownLatch计数器 → 启动3个子线程分别执行任务(之后,主线程陷入等待latch.await(2, TimeUnit.SECONDS),超时时间设置为2秒) → 子线程执行后将计数器-1(latch.countDown()) → 计数器值为0、或等待超时后 唤醒主线程继续向下执行

public static void main(String[] args) {try {Random random = new Random();//生成随机数类SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式System.out.println("现在是北京时间:"+df.format(new Date())+"======>公交车停车了!");String[] nameList = new String[]{"张三","李四","王五"};//假设此为在公交站台排队的人CountDownLatch latch = new CountDownLatch(2);//声明一个与人数相等的计数器for(String name : nameList){new Thread(new Runnable() {@Overridepublic void run() {try {System.out.println(name+"小老弟,上车了!===》"+df.format(new Date()));int s = random.nextInt(6);//生成0-6的随机数,用做等待秒数System.out.println(name+"小老弟,找座位需要===》"+s+"秒!");Thread.sleep(s*1000);//等待s秒System.out.println(name+"小老弟,找到座位了!===》"+df.format(new Date()));} catch (Exception e) {e.printStackTrace();} finally {latch.countDown();//计数器-1}}}).start();}latch.await(2, TimeUnit.SECONDS);//等待计数器为0,或2秒System.out.println("现在是北京时间:"+df.format(new Date())+"======>公交车启动了!");} catch (InterruptedException e) {e.printStackTrace();}
}

结果:

可能性1:

可能性2:

CountDownLatch--等待多线程计数器相关推荐

  1. 并发工具类(一)等待多线程完成的CountDownLatch

    简介 CountDownLatch 允许一个或多个线程等待其他线程完成操作. 应用场景 假如有这样一个需求,当我们需要解析一个Excel里多个sheet的数据时,可以考虑使用多线程,每个线程解析一个s ...

  2. 闭锁java_Java项目实践,CountDownLatch实现多线程闭锁

    摘要 本文主要介绍Java多线程并发中闭锁(Latch)的基本概念.原理.示例代码.应用场景,通过学习,可以掌握多线程并发时闭锁(Latch)的使用方法. 概念 "闭锁"就是指一个 ...

  3. CountDownLatch(线程计数器)

    CountDownLatch(线程计数器) CountDownLatch 类位于 java.util.concurrent 包下,利用它可以实现类似计数器的功能.比如有一个任务 A,它要等待其他 4 ...

  4. Semaphore控制同时访问的线程个数countdownlatch等待多个线程执行完本身线程再执行...

    Semaphore控制同时访问的线程个数countdownlatch等待多个线程执行完本身线程再执行 Semaphore控制同时访问的线程个数countdownlatch等待多个线程执行完本身线程再执 ...

  5. 等待多线程完成的CountDownLatch

    2019独角兽企业重金招聘Python工程师标准>>> 简介 CountDownLatch 允许一个或多个线程等待其他线程完成操作. 应用场景 假如有这样一个需求,当我们需要解析一个 ...

  6. java多线程百米赛跑_JAVA CountDownLatch(倒计时计数器)用法实例

    这篇文章主要介绍了JAVA CountDownLatch(倒计时计数器)用法实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 方法说明: publ ...

  7. 【高并发】JUC中等待多线程完成的工具类CountDownLatch

    文章目录 1.概述 2.CountDownLatch介绍 3.案例 3.1 示例1:一个简单的示例 3.1 示例2:等待指定的时间 3.1 示例3:2个CountDown结合使用的示例 6.源码 6. ...

  8. 介绍几种等待多线程任务执行完毕的方法

    一.引言: 在我们日常的开发过程中,我们经常会开启多个线程或者创建一个线程池去执行多个并发任务,当所有任务执行完毕后,我们一般会做一个统一的处理.那我们如何知道多个线程的任务已经全部执行完毕了呢? 今 ...

  9. 主线程如何等待多线程完成 返回数据_多线程基础体系知识清单

    作者:Object 来源:https://juejin.im/user/5d53e1f6f265da03af19cae0/posts 前言 本文会介绍Java中多线程与并发的基础,适合初学者食用. 线 ...

最新文章

  1. (已解决)Jupyter Notebook使用argparse报错:An exception has occurred, use %tb to see the full traceback.
  2. [SCOI2007]降雨量
  3. MySQL的4中隔离级别
  4. nginx功能扩展整理
  5. 试用版office 2010中提示Error opening SocialConnectorRes.dll求解!!
  6. 科大星云诗社动态20210830
  7. 别羡慕别人的舒服,静下心来坚持奋斗!!!
  8. android 数组排重方法,js数组去重方法集合 - osc_779ncf3o的个人空间 - OSCHINA - 中文开源技术交流社区...
  9. java.lang.StringBuffer源码分析
  10. 为什么 Math.min() 比 Math.max() 大?
  11. android-x86 下载地址
  12. 线性混合模型及R实现
  13. 职称计算机考试相当于几级,全国职称计算机考试与全国计算机等级考试有什么不同?...
  14. 一个uniapp开发的任务类小程序源码
  15. Cadence OrCAD Capture 在图纸中添加系统框图的方法
  16. C++在使用fgetc读取文件时出现方框乱码
  17. 分解质因数 C语言实现
  18. python取元素_python 如何提取对象内的元素
  19. Hash Exercise 21.11.27
  20. 多项式计算(python)

热门文章

  1. tensorflow的GPU加速计算
  2. Swiper 轮播插件
  3. sqli-labs-maser第1-6关
  4. 推荐三款动态壁纸软件,足够让你的桌面惊艳!
  5. python3 get爬取网页标题、链接和链接的数字ID
  6. 完美解决Failed to configure a DataSource: ‘url‘ attribute is not specified and no embedded datasource的问题
  7. fpga运算服务器_当FPGA也成为一种服务,你还在顾虑什么?
  8. 【随笔】方波的表示、转换与应用
  9. 解决IndexError: Target 2 is out of bounds.
  10. Debain 安装SVN服务器 支持http/https 全程指导