1、概述

CountDownLatch是一个同步器工具类,用来协调多个线程之间的同步,能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行,不可重置使用。

2、实现

使用一个计数器进行实现,计数器初始值为线程的数量,当每一个线程完成自己任务后,计数器的值就会减一,当计数器的值为0时,在CountDownLatch上等待的线程就可以恢复执行接下来的任务。

3、缺点

CountDownLatch是一次性的,计算器的值只能在构造方法中初始化一次,之后没有任何机制再次对其设置值,当CountDownLatch使用完毕后,它不能再次被使用。

4、方法说明:

  • public void countDown():递减锁存器的计数,如果计数到达零,则释放所有等待的线程。如果当前计数大于零,则将计数减少.
  • public viod await() /boolean await(long timeout,TimeUnit unit) :使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断或超出了指定的等待时间。如果当前计数为零,则此方法立刻返回true值。当线程调用了CountDownLatch对象的该方法后,当前线程会被阻塞,直到下面的情况之一发生才会返回:
    • 如果计数到达零,则该方法返回true值。
    • 如果当前线程,在进入此方法时已经设置了该线程的中断状态;或者在等待时被中断,则抛出InterruptedException,并且清除当前线程的已中断状态。
    • 如果超出了指定的等待时间,则返回值为false。如果该时间小于等于零,则该方法根本不会等待。参数:timeout-要等待的最长时间、unit-timeout 参数的时间单位

5、使用用法

  • 某一线程在开始运行前等待n个线程执行完毕
  • 多个线程开始执行任务的最大并行性(多个线程等待一个线程执行完成)

5.1 方法一

某一线程在开始运行前等待n个线程执行完毕,为某一个线程设置await(),当CountDownLatch为0时,执行当前线程。

public class Test {/*** 设置计数器大小为5*/private static CountDownLatch latch = new CountDownLatch(5);public static void loading(int num) {System.out.println("计数器数量为:" + num);try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}latch.countDown();}public static void main(String[] args) {new Thread(() -> {for (int i = 5; i >= 1; i--) {loading(i);}}, "t1").start();// 等待5个t1线程执行完成try {latch.await();System.out.println("执行主线程");} catch (InterruptedException e) {e.printStackTrace();}}
}

效果:

5.2 方法二

实现多个线程开始执行任务的最大并行性,比如设置CountDownLatch()初始化值为1,多个线程同时进行countdownlatch.await(),到计数器值为0时多个线程同时运行(多个线程等待其他线程执行完成后再执行)。

public class Test {/*** 设置计数器大小为1*/private static CountDownLatch latch = new CountDownLatch(1);public static void main(String[] args) {for (int i = 5; i >= 1; i--) {new Thread(() -> {try {System.out.println(Thread.currentThread().getName() + "-准备中");latch.await();System.out.println(Thread.currentThread().getName() + "-已完成");} catch (Exception e) {e.printStackTrace();}}).start();}// 等待一秒,让其他线程做好准备try {TimeUnit.SECONDS.sleep(1);System.out.println("执行主线程");latch.countDown();} catch (Exception e) {e.printStackTrace();}}
}

效果:

并发类编程—CountDownLatch(同步器)相关推荐

  1. 并发类编程—ReentrantLock(可重入锁)

    1.概念 ReentantLock继承接口 Lock 并实现了接口中定义的方法,他是一种可重入锁,除了能完成synchronized 所能完成的所有工作外,还提供了中断锁.定时锁等避免多线程死锁的方法 ...

  2. java并发编程代码示例_java并发编程之同步器代码示例

    java并发编程之同步器代码示例 发布时间:2020-09-08 16:53:41 来源:脚本之家 阅读:58 作者:Blessing_H 同步器是一些使线程能够等待另一个线程的对象,允许它们协调动作 ...

  3. 并发工具类:CountDownLatch、CyclicBarrier、Semaphore

    在多线程的场景下,有些并发流程需要人为来控制,在JDK的并发包里提供了几个并发工具类:CountDownLatch.CyclicBarrier.Semaphore. 一.CountDownLatch ...

  4. Java7并发编程指南——第七章:定制并发类

    Java7并发编程指南--第七章:定制并发类 @(并发和IO流) Java7并发编程指南第七章定制并发类 思维导图 项目代码 思维导图 项目代码 GitHub:Java7ConcurrencyCook ...

  5. Java 并发编程CountDownLatch的应用与源码解析

    应用场景 CountDownLatch是一个多线程控制工具.用来控制线程的等待. 设置需要countDown的数量,然后每一个线程执行完毕后调用countDown()方法,而在主线程中调用await( ...

  6. 可能要用心学高并发核心编程,限流原理与实战,分布式令牌桶限流

    实战:分布式令牌桶限流 本节介绍的分布式令牌桶限流通过Lua+Java结合完成,首先在Lua脚本中完成限流的计算,然后在Java代码中进行组织和调用. 分布式令牌桶限流Lua脚本 分布式令牌桶限流Lu ...

  7. JAVA中J.U.C 包下并发类的应用

    文章目录 JUC包中的锁应用 Lock接口及ReentrantLock对象分析及应用? Condition接口对象分析与应用? ReadWriteLock接口及实现类分析与应用? StampedLoc ...

  8. 《Java高并发核心编程.卷2,多线程、锁、JMM、JUC、高并发设计模式》

    <Java高并发核心编程.卷2,多线程.锁.JMM.JUC.高并发设计模式> 目录 第1章 多线程原理与实战 1.2 无处不在的进程和线程 1.2.1 进程的基本原理 1.2.2 线程的基 ...

  9. 再谈AbstractQueuedSynchronizer3:基于AbstractQueuedSynchronizer的并发类实现

    公平模式ReentrantLock实现原理 前面的文章研究了AbstractQueuedSynchronizer的独占锁和共享锁,有了前两篇文章的基础,就可以乘胜追击,看一下基于AbstractQue ...

  10. Jdk并发线程处理CountDownLatch、CyclicBarrier、Semaphore

    文章目录 1. CountDownLatch 1.1 描述 1.2 业务场景 1.3 代码 2. CyclicBarrier 2.1 说明 2.2 应用 2.3 代码 3. Semaphore 3.1 ...

最新文章

  1. 用zlib库读取单个压缩文档[转]
  2. 《复杂》读书笔记(part1)--一些思想是由简单的思想组合而成,我称此为复杂
  3. 中科大少年班目前为止出过多少大牛?
  4. cad动态块制作翻转_装X必学,手把手教你做CAD动态属性块
  5. php清空html_PHP清除html格式的代码
  6. IIS------IIS上部署MVC网站,打开后ExtensionlessUrlHandler-Integrated-4.0解决办法
  7. python3之线程
  8. 用MarkDown写PPT
  9. su的2019面试准备
  10. 台式计算机是32位还64位,电脑系统装64位还是32位系统好?考虑这些才能正确安装...
  11. 嵌入式网络的基础知识 -- 数据包的组装、拆解、各头部格式
  12. Oracle中Start With的用法
  13. java pdf to word_java pdf转word 高效不失真
  14. 全志T7/T507 Qt5.12.5移植记录
  15. 自然科学计算机技术ppt,[自然科学]图像处理.ppt
  16. 网址转换为ip(数字)地址
  17. JavaScript日记——实现图片的瀑布流和底部刷新
  18. 软件高分辨率缩放问题
  19. 3分钟搞懂阿里云服务器安装Nginx并配置静态访问页面
  20. 122. 买卖股票的最佳时机 II

热门文章

  1. 移动硬盘计算机无图标,移动硬盘不显示图标的处理方法
  2. 在oracle中bpa是什么意思,BPA是什么意思_BPA的翻译_音标_读音_用法_例句_爱词霸在线词典...
  3. Office 2010 word无法创建工作文件 请检查临时环境变量
  4. 3533: 黑白图像
  5. C++ 一篇搞懂继承的常见特性
  6. Google浏览器离线安装包下载
  7. Sniffer数据报文解码详解
  8. 2022.01.24翻译Lorry
  9. 【git commit --amend 修改提交记录】
  10. 好程序员分享面向对象概念的理解以及ES3和ES6中类的写法