为什么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相关推荐

  1. java常用的时间工具—原日期的基础上增加时间

    java常用的时间工具 1.在原日期的基础上增加天数 /*** 在原日期的基础上增加天数*/ public static Date add(Date date, int num) {Calendar ...

  2. java常用二进制数据转换工具

    经常需要与plc,单片机,传感器通讯,需要解析设备数据,java跟C不同,需要二进制转换成java的数据,因此整理了一个工具,共享出来,欢迎大家来指正. /**  * 常用二进制数据转换工具  * @ ...

  3. 【云驻共创】 JAVA常用的开发工具有哪些?

    前言 俗话说,工欲善其事,必先利其器.工匠想要使他的工作做好,一定要先让工具锋利.比喻要做好一件事,准备工具非常重要.对于我们做程序员的来说也是一样的,想要提高开发效率,也需要选择好自己的开发工具,下 ...

  4. 社群运营中常用的辅助工具,口碑推荐这几款!

    职场生活很残酷,大鱼吃小鱼,小鱼吃虾米,虾米卷铺盖走人,没有扎实的实力往往很容易被淘汰,所以作为每一个职场同学,要提高工作效率就得借助一些辅助工具,让复杂的事情简单化,简单的事情更加便捷化. 那么社群 ...

  5. Java之多线程下载工具类

    1.多线程下载工具类 import java.net.URL; import java.io.InputStream; import java.io.RandomAccessFile; import ...

  6. Java多线程并发控制工具CountDownLatch,实现原理及案例

    跟着作者的65节课彻底搞懂Java并发原理专栏,一步步彻底搞懂Java并发原理. 作者简介:笔名seaboat,擅长工程算法.人工智能算法.自然语言处理.架构.分布式.高并发.大数据和搜索引擎等方面的 ...

  7. JAVA 常用框架和工具

    集成开发工具(IDE):Eclipse.MyEclipse.Spring Tool Suite(STS).Intellij IDEA.NetBeans.JBuilder.JCreator JAVA服务 ...

  8. JAVA中的并发工具 -- CountDownLatch、CyclicBarrier、Semaphore

    2019独角兽企业重金招聘Python工程师标准>>> CountDownLatch CountDownLatch允许一个或多个线程等待其他线程完成操作. CountDownLatc ...

  9. Java 常用HTTP请求工具类HttpUtils

    .pom依赖 <!-- httpclient --><dependency><groupId>org.apache.httpcomponents</group ...

最新文章

  1. 《40期》 我们要把世纪末日变成重生日
  2. 可想实现一个自己的简单jQuery库?(五)
  3. android拍照自动裁剪_新功能上线!智能人像抠图、图片自由裁剪,PPT 还能这么玩?...
  4. GDT、GDTR、LDT、LDTR的理解
  5. Windows 系统版本判断
  6. 操作系统进程调度先来先服务FCFS
  7. uCOS-III应用开发笔记之一:uCOS-III在STM32的移植
  8. 华为云企业级Redis讲解第16期:超越开源Redis的ACID“真“事务
  9. 程序员的自我修养——读《软技能-代码之外的生存指南》笔记
  10. andriod环境搭建
  11. C# DevExpress组件 - ChartControl图表控件
  12. 工具类官网Web原型制作分享-Adobe
  13. PaddleOCR二次全流程——2.使用StyleText合成图片
  14. 嵌入式状态机编程-QP状态机框架与常见状态机方法
  15. vue-echarts渲染中国地图以及省份地图
  16. Oracle动态性能视图学习之v$session_longops
  17. 一个计算机网络的物理组成,1.1.2.1 计算机网络物理组成
  18. AppScan渗透测试
  19. 如何用计算机组添加打印机共享的打印机,win7如何添加打印机_Win7电脑如何设置打印机家庭组共享?...
  20. endl和\n的区别

热门文章

  1. Uva 10074【递推dp】
  2. jenkins添加git源码目录时报Error performing command错误
  3. 二分 + 模拟 - Carries
  4. LeetCode - Maximum Depth of Binary Tree
  5. icinga服务器系统监控软件的安装
  6. 如何在阿里云上安全的存放您的配置 - 续
  7. Android NDK开发之旅29 云服务器Ubuntu下搭建NDK环境,并编译FFmpeg
  8. finecms设置伪静态后分享到微信不能访问怎么处理
  9. JAVA好书之《深入理解Java虚拟机》
  10. Apple的LZF算法解析