Java常用多线程辅助工具---countdownLatch
为什么80%的码农都做不了架构师?>>>
前言
上一篇博文说到semaphore,一个加强版的synchronized,该多线程辅助工具适用于控制对资源操作或者访问的场景。现在有一张场景是,需要等各个线程都都执行完了再进行下一步的操作,比如需要批量对上传的文件进行压缩,上传十个文件,压缩成一个包,这时候,就需要等上传完十个以后再进行压缩操作,类似于阻塞,concurrent包提供了countdownLatch辅助工具。
countdownLatch,中文翻译是门闩的意思,类似一个计数器,控制线程执行任务的时机,以组团的方式一起执行任务。该类会判断count计数不为0时,则呈wait状态,也就是屏障处等待,如果为0则继续执行。
入门
开启两个线程进行计数,同时主线程在wait状态,最后实现组团执行后续任务:
@Testpublic void testCountDownLatch() throws InterruptedException {CountDownLatch latch = new CountDownLatch(2);for (int i = 0; i < 2; i++) {new Thread(() -> {log.info("开始count,当前是线程:{},时间是:{}",Thread.currentThread().getName(),LocalDateTime.now());try {Thread.currentThread().sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}latch.countDown();}).start();}log.info("等待计数器count,现在是:{}", LocalDateTime.now());latch.await();log.info("结束计数器count,现在是:{}", LocalDateTime.now());}
运行结果是:
比较复杂的使用案例
模拟运动员从到场准备到开跑的过程,具体代码如下:
@Test public void testCountDownLatch2() throws InterruptedException {CountDownLatch comingTag = new CountDownLatch(5);CountDownLatch waitTag = new CountDownLatch(1);CountDownLatch waitRunTag = new CountDownLatch(5);CountDownLatch beginTag = new CountDownLatch(1);CountDownLatch endTag = new CountDownLatch(5);for (int i = 0; i < 5; i++) {new Thread(() -> {try {Thread.sleep(5000);log.info("{}号运动员已经入场,time:{}", Thread.currentThread().getName(), LocalDateTime.now());comingTag.countDown();waitTag.await();log.info("{}号运动员开始准备,time:{}", Thread.currentThread().getName(), LocalDateTime.now());Thread.sleep(3000);waitRunTag.countDown();log.info("{}号运动员准备结束,time:{}", Thread.currentThread().getName(), LocalDateTime.now());beginTag.await();log.info("{}号运动员开跑,time:{}", Thread.currentThread().getName(), LocalDateTime.now());Thread.sleep(2000);log.info("{}号运动员跑完了,time:{}", Thread.currentThread().getName(), LocalDateTime.now());endTag.countDown();} catch (InterruptedException e) {e.printStackTrace();}}).start();}comingTag.await();log.info("运动员全部入场,time:{}", LocalDateTime.now());log.info("预备口令,time:{}", LocalDateTime.now());Thread.sleep(2000);waitTag.countDown();waitRunTag.await();log.info("远动员准备完毕,time:{}", LocalDateTime.now());log.info("发令枪响,time:{}", LocalDateTime.now());Thread.sleep(2000);beginTag.countDown();endTag.await();log.info("全部运动员到达终点,time:{}", LocalDateTime.now()); }
运行结果是:
转载于:https://my.oschina.net/u/3470849/blog/1824247
Java常用多线程辅助工具---countdownLatch相关推荐
- java常用的时间工具—原日期的基础上增加时间
java常用的时间工具 1.在原日期的基础上增加天数 /*** 在原日期的基础上增加天数*/ public static Date add(Date date, int num) {Calendar ...
- java常用二进制数据转换工具
经常需要与plc,单片机,传感器通讯,需要解析设备数据,java跟C不同,需要二进制转换成java的数据,因此整理了一个工具,共享出来,欢迎大家来指正. /** * 常用二进制数据转换工具 * @ ...
- 【云驻共创】 JAVA常用的开发工具有哪些?
前言 俗话说,工欲善其事,必先利其器.工匠想要使他的工作做好,一定要先让工具锋利.比喻要做好一件事,准备工具非常重要.对于我们做程序员的来说也是一样的,想要提高开发效率,也需要选择好自己的开发工具,下 ...
- 社群运营中常用的辅助工具,口碑推荐这几款!
职场生活很残酷,大鱼吃小鱼,小鱼吃虾米,虾米卷铺盖走人,没有扎实的实力往往很容易被淘汰,所以作为每一个职场同学,要提高工作效率就得借助一些辅助工具,让复杂的事情简单化,简单的事情更加便捷化. 那么社群 ...
- Java之多线程下载工具类
1.多线程下载工具类 import java.net.URL; import java.io.InputStream; import java.io.RandomAccessFile; import ...
- Java多线程并发控制工具CountDownLatch,实现原理及案例
跟着作者的65节课彻底搞懂Java并发原理专栏,一步步彻底搞懂Java并发原理. 作者简介:笔名seaboat,擅长工程算法.人工智能算法.自然语言处理.架构.分布式.高并发.大数据和搜索引擎等方面的 ...
- JAVA 常用框架和工具
集成开发工具(IDE):Eclipse.MyEclipse.Spring Tool Suite(STS).Intellij IDEA.NetBeans.JBuilder.JCreator JAVA服务 ...
- JAVA中的并发工具 -- CountDownLatch、CyclicBarrier、Semaphore
2019独角兽企业重金招聘Python工程师标准>>> CountDownLatch CountDownLatch允许一个或多个线程等待其他线程完成操作. CountDownLatc ...
- Java 常用HTTP请求工具类HttpUtils
.pom依赖 <!-- httpclient --><dependency><groupId>org.apache.httpcomponents</group ...
最新文章
- 《40期》 我们要把世纪末日变成重生日
- 可想实现一个自己的简单jQuery库?(五)
- android拍照自动裁剪_新功能上线!智能人像抠图、图片自由裁剪,PPT 还能这么玩?...
- GDT、GDTR、LDT、LDTR的理解
- Windows 系统版本判断
- 操作系统进程调度先来先服务FCFS
- uCOS-III应用开发笔记之一:uCOS-III在STM32的移植
- 华为云企业级Redis讲解第16期:超越开源Redis的ACID“真“事务
- 程序员的自我修养——读《软技能-代码之外的生存指南》笔记
- andriod环境搭建
- C# DevExpress组件 - ChartControl图表控件
- 工具类官网Web原型制作分享-Adobe
- PaddleOCR二次全流程——2.使用StyleText合成图片
- 嵌入式状态机编程-QP状态机框架与常见状态机方法
- vue-echarts渲染中国地图以及省份地图
- Oracle动态性能视图学习之v$session_longops
- 一个计算机网络的物理组成,1.1.2.1 计算机网络物理组成
- AppScan渗透测试
- 如何用计算机组添加打印机共享的打印机,win7如何添加打印机_Win7电脑如何设置打印机家庭组共享?...
- endl和\n的区别