CountDownLatch 可以立即看作一个计数器,不过计数是原子操作,也就是说同一时间只有一个线程能够操作该计数器;

我们先看看该类常用的几个方法:

你可以给它设定一个数目,调用该类await方法会使调用await的方法的线程处于等待状态;直到该计数器计数为0;由此特性,我们可以将它用于一下场景:

场景:只有把所有的任务执行完毕后才执行另外一个任务

下面演示是当把三个WorkTask任务都执行完毕后才执行AllTaskDonedTask任务

public class Test{public static void main(String[] args) {int taskSize = 3;//创建一个计数器,并对其初始化final CountDownLatch doneSingle = new CountDownLatch(taskSize);//创建一个固定线程池,此处线程池的线程数目和taskSize无直接关Executor executor = Executors.newFixedThreadPool(taskSize);//执行所有任务for (int i = 0; i < taskSize; i++) {executor.execute(new WorkTask(doneSingle));}executor.execute(new AllTaskDonedTask(countDownLatch));}static class WorkTask implements Runnable {CountDownLatch mCountDownLatch;public WorkTask(CountDownLatch countDownLatch) {mCountDownLatch = countDownLatch;}@Overridepublic void run() {try {println(Thread.currentThread().getName()+" execute task....");Thread.sleep(1000);//模拟耗时操作mCountDownLatch.countDown();//任务执行完毕计数器减1} catch (InterruptedException e) {e.printStackTrace();}}}//所有任务执行完毕后需要执行的任务static class AllTaskDonedTask implements Runnable {CountDownLatch mCountDownLatch;public AllTaskDonedTask(CountDownLatch countDownLatch) {mCountDownLatch = countDownLatch;}@Overridepublic void run() {try {mCountDownLatch.await();//此处会使当前线程处于等待状态,直到3个WorkTask全部执行完毕,才会继续执行下面println("所有任务执行完毕我才执行");} catch (InterruptedException e) {e.printStackTrace();}}}}

执行结果

pool-1-thread-3 execute task....
pool-1-thread-1 execute task....
pool-1-thread-2 execute task....
所有任务执行完毕我才执行

从上面代码我们不难看出,我们在执行WorkTask任务结束时都需要对计数器减1;在AllTaskDonedTask任务执行前需要调用CountDownLatch.await()方法,这样当前线程会处于等待状态,直到计数器减为0时也即WorkTask任务都执行完毕后,AllTaskDonedTask方可执行。

Java多线程-CountDownLatch用法相关推荐

  1. JAVA多线程-CountDownLatch计数器

    一.概述 CountDownLatch是一个同步工具类,它允许一个或多个线程等待其他线程执行完操作之后再继续执行.通常用于控制多个线程的执行顺序. 二.基本原理 我们可以把CountDownLatch ...

  2. 40个问题让你快速掌握Java多线程的精髓

    本文分享自华为云社区<对Java多线程的用法感到一头乱麻?40个问题让你快速掌握多线程的精髓>,原文作者:breakDraw . 多线程可以理解为在同一个程序中能够同时运行多个不同的线程来 ...

  3. Java多线程-通讯方式

    Java多线程-通讯方式 线程之间为什么要通信? 通信的目的是为了更好的协作,线程无论是交替式执行,还是接力式执行,都需要进行通信告知.那么java线程是如何通信的呢,大致有以下六种方式. Java线 ...

  4. java多线程下LongAdder、CountDownLatch、CyclicBarrier、Phaser 的用法

    前言 一文读懂java多线程下常用常考的阻塞方法LongAdder.CountDownLatch.CyclicBarrier.Phaser 包含演示代码 高并发模拟,性能比较实例代码 前言 LongA ...

  5. Java多线程(八)之Semaphore、CountDownLatch、CyclicBarrier、Exchanger

    一.引言 Semaphore               :一个计数信号量 CountDownLatch          :一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线 ...

  6. java resume过时方法_学点开发|关于Java多线程用法解析

    在进行学习之前,我们先来了解下,什么是Java多线程: 多线程是实现并发机制的一种有效手段.进程和线程一样,都是实现并发的一个基本单位.为了让大家更清晰读懂关于Java多线程用法,由以下几点入手学,帮 ...

  7. Java多线程之CountDownLatch用法

    Java多线程之CountDownLatch用法 本文目录: CountDownLatch基本概念 CountDownLatch案例:6个同学陆续离开教室后班长才可以关门 CountDownLatch ...

  8. 详解Java多线程编程中LockSupport类的线程阻塞用法

    转载自  详解Java多线程编程中LockSupport类的线程阻塞用法 LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语.LockSupport实际 ...

  9. Java多线程系列(九):CountDownLatch、Semaphore等4大并发工具类详解

    之前谈过高并发编程系列:4种常用Java线程锁的特点,性能比较.使用场景 ,以及高并发编程系列:ConcurrentHashMap的实现原理(JDK1.7和JDK1.8) 今天主要介绍concurre ...

最新文章

  1. 上传程序网站至服务器
  2. 打包本地文件, 并使用Winscp上传脚本
  3. iphone导出照片到电脑_如何更改 iPhone 照片格式?
  4. Repeater嵌套
  5. 'cross-env' 不是内部或外部命令,也不是可运行的程序
  6. linux mysql libc.so_mysql-arm-linux-gcc编译报错:libc.soformatnotrecognized.
  7. Cookie和Session区别
  8. Python列表和字典的方法总结
  9. inside sqlite_Inside Codeland –迄今为止最具包容性的开发者大会
  10. pyinstaller打包总结
  11. [转载] Java异常处理中Try-Catch-Finally中常见的笔试题
  12. git把当前修改提交合并到上一条提交如何操作
  13. 软考-中级-网络工程师-2021年下半年-上午真题整理
  14. mtk 充电出错问题
  15. SCRUM浅谈,User Story,Sprint,Burn Down Chart
  16. 《实战java程序设计---上》
  17. ssm酒店预订系统ssm酒店管理系统民宿预订ssm酒店客房预订系统SSM客房预订系统
  18. 模拟器:思科 给路由器配置IP地址和子网掩码
  19. php slik转wav_node.js安装wx-voice转换silk和mp3
  20. - Statement

热门文章

  1. python代码用c语言封装_使用C语言扩展Python程序的简单入门指引
  2. 三十二、Java集合中的ArrayList
  3. 九、玩转JavaScript的数组(五)
  4. 招聘一周 | 腾讯、华为、微软、中科院自动化所等12家公司热招职位汇总
  5. 一场直播教你深挖6万篇论文+50万学者信息,瓜分10万元奖金
  6. 直播 | Circle Loss:从对相似性优化的统一视角进行深度特征学习
  7. 直播预告 | 高效视频理解模型的设计及ICCV比赛冠军方案解读
  8. 刚刚,阿里开源了一系列重磅技术炸弹!| 程序员必看
  9. 深度强化学习的 18 个关键问题 | PaperDaily #30
  10. 沉默是金 矩阵快速幂