并发类编程—CountDownLatch(同步器)
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(同步器)相关推荐
- 并发类编程—ReentrantLock(可重入锁)
1.概念 ReentantLock继承接口 Lock 并实现了接口中定义的方法,他是一种可重入锁,除了能完成synchronized 所能完成的所有工作外,还提供了中断锁.定时锁等避免多线程死锁的方法 ...
- java并发编程代码示例_java并发编程之同步器代码示例
java并发编程之同步器代码示例 发布时间:2020-09-08 16:53:41 来源:脚本之家 阅读:58 作者:Blessing_H 同步器是一些使线程能够等待另一个线程的对象,允许它们协调动作 ...
- 并发工具类:CountDownLatch、CyclicBarrier、Semaphore
在多线程的场景下,有些并发流程需要人为来控制,在JDK的并发包里提供了几个并发工具类:CountDownLatch.CyclicBarrier.Semaphore. 一.CountDownLatch ...
- Java7并发编程指南——第七章:定制并发类
Java7并发编程指南--第七章:定制并发类 @(并发和IO流) Java7并发编程指南第七章定制并发类 思维导图 项目代码 思维导图 项目代码 GitHub:Java7ConcurrencyCook ...
- Java 并发编程CountDownLatch的应用与源码解析
应用场景 CountDownLatch是一个多线程控制工具.用来控制线程的等待. 设置需要countDown的数量,然后每一个线程执行完毕后调用countDown()方法,而在主线程中调用await( ...
- 可能要用心学高并发核心编程,限流原理与实战,分布式令牌桶限流
实战:分布式令牌桶限流 本节介绍的分布式令牌桶限流通过Lua+Java结合完成,首先在Lua脚本中完成限流的计算,然后在Java代码中进行组织和调用. 分布式令牌桶限流Lua脚本 分布式令牌桶限流Lu ...
- JAVA中J.U.C 包下并发类的应用
文章目录 JUC包中的锁应用 Lock接口及ReentrantLock对象分析及应用? Condition接口对象分析与应用? ReadWriteLock接口及实现类分析与应用? StampedLoc ...
- 《Java高并发核心编程.卷2,多线程、锁、JMM、JUC、高并发设计模式》
<Java高并发核心编程.卷2,多线程.锁.JMM.JUC.高并发设计模式> 目录 第1章 多线程原理与实战 1.2 无处不在的进程和线程 1.2.1 进程的基本原理 1.2.2 线程的基 ...
- 再谈AbstractQueuedSynchronizer3:基于AbstractQueuedSynchronizer的并发类实现
公平模式ReentrantLock实现原理 前面的文章研究了AbstractQueuedSynchronizer的独占锁和共享锁,有了前两篇文章的基础,就可以乘胜追击,看一下基于AbstractQue ...
- Jdk并发线程处理CountDownLatch、CyclicBarrier、Semaphore
文章目录 1. CountDownLatch 1.1 描述 1.2 业务场景 1.3 代码 2. CyclicBarrier 2.1 说明 2.2 应用 2.3 代码 3. Semaphore 3.1 ...
最新文章
- 用zlib库读取单个压缩文档[转]
- 《复杂》读书笔记(part1)--一些思想是由简单的思想组合而成,我称此为复杂
- 中科大少年班目前为止出过多少大牛?
- cad动态块制作翻转_装X必学,手把手教你做CAD动态属性块
- php清空html_PHP清除html格式的代码
- IIS------IIS上部署MVC网站,打开后ExtensionlessUrlHandler-Integrated-4.0解决办法
- python3之线程
- 用MarkDown写PPT
- su的2019面试准备
- 台式计算机是32位还64位,电脑系统装64位还是32位系统好?考虑这些才能正确安装...
- 嵌入式网络的基础知识 -- 数据包的组装、拆解、各头部格式
- Oracle中Start With的用法
- java pdf to word_java pdf转word 高效不失真
- 全志T7/T507 Qt5.12.5移植记录
- 自然科学计算机技术ppt,[自然科学]图像处理.ppt
- 网址转换为ip(数字)地址
- JavaScript日记——实现图片的瀑布流和底部刷新
- 软件高分辨率缩放问题
- 3分钟搞懂阿里云服务器安装Nginx并配置静态访问页面
- 122. 买卖股票的最佳时机 II
热门文章
- 移动硬盘计算机无图标,移动硬盘不显示图标的处理方法
- 在oracle中bpa是什么意思,BPA是什么意思_BPA的翻译_音标_读音_用法_例句_爱词霸在线词典...
- Office 2010 word无法创建工作文件 请检查临时环境变量
- 3533: 黑白图像
- C++ 一篇搞懂继承的常见特性
- Google浏览器离线安装包下载
- Sniffer数据报文解码详解
- 2022.01.24翻译Lorry
- 【git commit --amend 修改提交记录】
- 好程序员分享面向对象概念的理解以及ES3和ES6中类的写法