public class CountDownLatchextends Object一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。

  • 假设定义一个计数器为 5。
  • 每个线程完成任务后计数减1
  • 计数器减为 0 则通知等待的线程。

用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞。之后,会释放所有等待的线程,await 的所有后续调用都将立即返回。这种现象只出现一次——计数无法被重置。如果需要重置计数,请考虑使用 CyclicBarrier。

CountDownLatch 是一个通用同步工具,它有很多用途。将计数 1 初始化的 CountDownLatch 用作一个简单的开/关锁存器,或入口:在通过调用 countDown() 的线程打开入口前,所有调用 await 的线程都一直在入口处等待。用 N 初始化的 CountDownLatch 可以使一个线程在 N 个线程完成某项操作之前一直等待,或者使其在某项操作完成 N 次之前一直等待。

CountDownLatch 的一个有用特性是,它不要求调用 countDown 方法的线程等到计数到达零时才继续,而在所有线程都能通过之前,它只是阻止任何线程继续通过一个 await。

根据API原话写个小Demo

public class CountDownLatchDemo {public static void main(String[] args) throws InterruptedException {CountDownLatch countDownLatch = new CountDownLatch(5);for (int i = 1; i <= 5; i++){new Thread(()->{System.out.println(Thread.currentThread().getName()+"\t上完自习,离开教室");countDownLatch.countDown();},String.valueOf(i)).start();}countDownLatch.await();System.out.println(Thread.currentThread().getName()+"\t***********班长最后关灯锁门!!");}
}

执行结果

下面加上枚举,顺便学习下枚举

java枚举可以看做成一张数据库的表,每一个()就是一行数据,()中每个元素就是表的字段
然后写get方法和构造方法

package JUC;import lombok.Getter;import java.util.concurrent.CountDownLatch;public class CountDownLatchDemo {public static void main(String[] args) throws InterruptedException {CountDownLatch countDownLatch = new CountDownLatch(5);for (int i = 1; i <= 5; i++){new Thread(()->{System.out.println(Thread.currentThread().getName()+"\t国被灭");countDownLatch.countDown();},CountryEnum.forEach_CountryEnum(i).getReMessage()).start();}countDownLatch.await();System.out.println(Thread.currentThread().getName()+"\t***********秦国,一统华夏!!");//System.out.println(CountryEnum.SIX);//System.out.println(CountryEnum.TWO.getReMessage());//System.out.println(CountryEnum.FOUR.getReCode());}
}enum CountryEnum {ONE(1,"楚"),TWO(2,"燕"),THREE(3,"韩"),FOUR(4,"赵"),FIVE(5,"魏"),SIX(6,"齐");@Getter private Integer reCode;  //用@Getter就不需要写get方法了,但是需要引入import lombok.Getter;没下载过需要maven下载包,或者直接写下面的get方法@Getter private String reMessage;public Integer getReCode() {return reCode;}public String getReMessage() {return reMessage;}CountryEnum(Integer reCode, String reMessage) {this.reCode = reCode;this.reMessage = reMessage;}public static CountryEnum forEach_CountryEnum(int index){CountryEnum[] values = CountryEnum.values();for (CountryEnum element : values) {if (element.reCode == index){return element; //找到}}return null; //找不到}
}

CountDownLatch,同步辅助类相关推荐

  1. Java中的5种同步辅助类

    当你使用synchronized关键字的时候,是通过互斥器来保障线程安全以及对共享资源的同步访问.线程间也经常需要更进一步的协调执行,来完成复杂的并发任务,比如wait/notify模式就是一种在多线 ...

  2. 线程:CountDownLatch同步工具

    一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 类似计数器,当计数器的值为0时,继续往下执行. 1 package ch03; 2 3 import java. ...

  3. Java的几个同步辅助类

    Java为我们提供了一些同步辅助类,利用这些辅助类我们可以在多线程编程中,灵活地把握线程的状态. CountDownLatch CountDownLatch一个同步辅助类,在完成一组正在其他线程中执行 ...

  4. Java7并发编程指南——第三章:线程同步辅助类

    Java7并发编程指南--第三章:线程同步辅助类 @(并发和IO流) Java7并发编程指南第三章线程同步辅助类 思维导图 项目代码 思维导图 项目代码 GitHub:Java7Concurrency ...

  5. java并发之同步辅助类CyclicBarrier和CountDownLatch

    CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier).它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门, ...

  6. 线程同步辅助类CyclicBarrier

    CyclicBarrier 是一个可重置的多路同步点,在某些并行编程风格中很有用. 集合点同步:CyclicBarrier 多条线程同时执行一个阶段性任务时,相互等待,等到最后一个线程执行完阶段后,才 ...

  7. Java多线程拾遗(五) 使用CountDownLatch同步线程

    CountDownLatch 是什么? 先看看CountDownLatch源码注释第一行给出的定义. 让一个或多个线程等待,直到在其他线程中执行的一组操作完成的同步辅助程序 我们在编码中很多时候需要多 ...

  8. JUC: 同步辅助类

    java.util.concurrent包下,有一些关于同步的辅助工具类,比如CountDownLatch.CyclicBarrier等. CountDownLatch 允许一个或多个线程等待直到在其 ...

  9. 线程中的同步辅助类Exchanger

    Exchanger 允许两个线程在 collection 点交换对象,它在多流水线设计中是有用的. 允许两条线程之间交换数据.Exchanger的exchange方法是阻塞的,当其他线程也调用了该方法 ...

最新文章

  1. Nature:根系菌群参与磷胁迫和免疫的平衡
  2. “libc++_shared.so“ not found 解决
  3. JSTL标签的用法详解
  4. C# 版本设计模式(Design Pattern)---------------总序
  5. 情感数据对LSTM股票预测模型的影响研究
  6. iOS成长之button
  7. python刚需_python案例(六): RFM在玩什么?
  8. arcgis engine设置数据源路径_不懂ArcGIS,你前期分析用什么做的?
  9. 北大核心期刊目录2020_2020年RCCSE权威、核心期刊目录总览
  10. I2C(smbus、pmbus)和SPI协议分析
  11. R-CNN、Fast R-CNN、Faster R-CNN算法对比
  12. 有哪些不错的查文献或查资料的网站或APP?
  13. java 6面骰子_Java实现的简单掷骰子游戏示例
  14. 微pe不识别nvme固态硬盘_WinPE无法识别NVMe SSD硬盘,如何重装系统
  15. HDU4699:Editor
  16. 7月书讯(下)| 宝藏新书助你“乘风破浪”
  17. Google的设计原则
  18. SpringBoot项目启动异常:Field settlementMissService in...Service required a single bean, but 2 were found:
  19. Python练习:简单的登陆注册的信息管理;模块化;密码安全判断(没有用数据库和文件)
  20. deployer部署_使用Deployer轻松部署PHP应用程序

热门文章

  1. Delphi XE7实现的任意位置弹出菜单
  2. 武汉大学2013年数学分析考研试题参考解答
  3. SystemVerilog例子---traffic light
  4. intent几种传值数组、对象、集合(Array,Object,List)
  5. 复盘二进制的习题(2)
  6. 二元随机变量函数的分布
  7. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第19篇]Shamir密钥交换场景
  8. 【数据结构与算法】【算法思想】位图
  9. css没有border,你未必知道的CSS小知识:为什么没有人使用border-image
  10. java.nio.file 找不到_java - 断言该错误:无法访问路径(找不到java.nio.file.Path) - 堆栈内存溢出...