CountDownLatch 是一个非常实用的多线程控制工具类。” Count Down ” 在英文中意为倒计数, Latch 为门问的意思。如果翻译成为倒计数门阀, 我想大家都会觉得不知所云吧! 因此,这里简单地称之为倒计数器。在这里, 门问的含义是:把门锁起来,不让里面的线程跑出来。因此,这个工具通常用来控制线程等待,它可以让某一个线程等待直到倒计时结束, 再开始执行。

CountDown Latch 的构造函数接收一个整数作为参数,即当前这个计数器的计数个数。

  1. public CountDownLatch(int count)

CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。一个CountDownLatch初始化为给定的计数 。 调用await方法阻塞,直到当前计数为零,在调用countDown()方法之后,所有等待的线程被释放,任何后续调用await立即返回。 这是一次性的现象 - 计数不能重置。 如果需要重置计数,考虑使用CyclicBarrier ,CyclicBarrier的计数器可以被重置后使用,因此它被称为是循环的barrier。

主要方法:

  1. // 使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断。
  2. void await()
  3. // 使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断或超出了指定的等待时间。
  4. boolean await(long timeout, TimeUnit unit)
  5. // 递减锁存器的计数,如果计数到达零,则释放所有等待的线程。
  6. void countDown()
  7. // 返回当前计数。
  8. long getCount()

我们来看一个例子:

  1. public class TestCountDownLatch {
  2. private static final int RUNNER_NUMBER = 5; // 运动员个数
  3. private static final Random RANDOM = new Random();
  4. public static void main(String[] args) {
  5. // 用于判断发令之前运动员是否已经完全进入准备状态,需要等待5个运动员,所以参数为5
  6. CountDownLatch readyLatch = new CountDownLatch(RUNNER_NUMBER);
  7. // 用于判断裁判是否已经发令,只需要等待一个裁判,所以参数为1
  8. CountDownLatch startLatch = new CountDownLatch(1);
  9. for (int i = 0; i < RUNNER_NUMBER; i++) {
  10. Thread t = new Thread(new Runner((i + 1) + "号运动员", readyLatch, startLatch));
  11. t.start();
  12. }
  13. try {
  14. readyLatch.await();
  15. } catch (InterruptedException e) {
  16. e.printStackTrace();
  17. }
  18. startLatch.countDown();
  19. System.out.println("裁判:所有运动员准备完毕,开始...");
  20. }
  21. static class Runner implements Runnable {
  22. private CountDownLatch readyLatch;
  23. private CountDownLatch startLatch;
  24. private String name;
  25. public Runner(String name, CountDownLatch readyLatch, CountDownLatch startLatch) {
  26. this.name = name;
  27. this.readyLatch = readyLatch;
  28. this.startLatch = startLatch;
  29. }
  30. public void run() {
  31. int readyTime = RANDOM.nextInt(1000);
  32. System.out.println(name + ":我需要" + readyTime + "秒时间准备.");
  33. try {
  34. Thread.sleep(readyTime);
  35. } catch (InterruptedException e) {
  36. e.printStackTrace();
  37. }
  38. System.out.println(name + ":我已经准备完毕.");
  39. readyLatch.countDown();
  40. try {
  41. startLatch.await(); // 等待裁判发开始命令
  42. } catch (InterruptedException e) {
  43. e.printStackTrace();
  44. }
  45. System.out.println(name + ":开跑...");
  46. }
  47. }
  48. }

打印结果:

  1. 1号运动员:我需要547秒时间准备.
  2. 2号运动员:我需要281秒时间准备.
  3. 4号运动员:我需要563秒时间准备.
  4. 5号运动员:我需要916秒时间准备.
  5. 3号运动员:我需要461秒时间准备.
  6. 2号运动员:我已经准备完毕.
  7. 3号运动员:我已经准备完毕.
  8. 1号运动员:我已经准备完毕.
  9. 4号运动员:我已经准备完毕.
  10. 5号运动员:我已经准备完毕.
  11. 裁判:所有运动员准备完毕,开始...
  12. 3号运动员:开跑...
  13. 2号运动员:开跑...
  14. 1号运动员:开跑...
  15. 4号运动员:开跑...
  16. 5号运动员:开跑...
  17. Process finished with exit code 0

注意:计数器必须大于等于0,只是等于0时候,计数器就是零,调用await方法时不会阻塞当前线程。

java并发编程(八)----(JUC)CountDownLatch的更多相关文章

  1. Java并发编程工具类 CountDownLatch CyclicBarrier Semaphore使用Demo

    Java并发编程工具类 CountDownLatch CyclicBarrier Semaphore使用Demo CountDownLatch countDownLatch这个类使一个线程等待其他线程 ...

  2. Java 并发编程中的 CountDownLatch 锁用于多个线程同时开始运行或主线程等待子线程结束

    Java 5 开始引入的 Concurrent 并发软件包里面的 CountDownLatch 其实可以把它看作一个计数器,只不过这个计数器的操作是原子操作,同时只能有一个线程去操作这个计数器,也就是 ...

  3. Java并发编程笔记之 CountDownLatch闭锁的源码分析

    JUC 中倒数计数器 CountDownLatch 的使用与原理分析,当需要等待多个线程执行完毕后在做一件事情时候 CountDownLatch 是比调用线程的 join 方法更好的选择,CountD ...

  4. Java并发编程(3) JUC中的锁

    一 前言 前面已经说到JUC中的锁主要是基于AQS实现,而AQS(AQS的内部结构 .AQS的设计与实现)在前面已经简单介绍过了.今天记录下JUC包下的锁是怎么基于AQS上实现的 二 同步锁 同步锁不 ...

  5. Java并发编程之闭锁CountDownLatch简单介绍

    闭锁相当于一扇门,在闭锁到达结束状态之前,这扇门一直是关闭着的,没有不论什么线程能够通过,当到达结束状态时.这扇门才会打开并容许全部线程通过.它能够使一个或多个线程等待一组事件发生. 闭锁状态包含一个 ...

  6. java并发编程之二--CountDownLatch的使用

    CountDownLatch类 允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助. CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行.使用一个 ...

  7. java并发编程(八) CAS & Unsafe & atomic

    参考文档:https://www.cnblogs.com/xrq730/p/4976007.html CAS(Compare and Swap) 一个CAS方法包含三个参数CAS(V,E,N).V表示 ...

  8. Java并发编程 (八) J.U.C组件拓展

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.J.U.C-FutureTask-1 FutureTask组件,该组件是JUC中的.但该组件不是 A ...

  9. Java并发编程-JUC-CountDownLatch 倒计数门闩器-等待多线程完成再放行 -一次性使用

    如题 (总结要点) CountDownLatch 倒计数门闩器, 让1-n-1个线程等待其他多线程完成工作. (Excel的多个Sheet的解析,最终等待解析完毕后;要实现主线程等待所有线程完成she ...

  10. java并发编程工具类JUC第八篇:ConcurrentHashMap

    在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口.ArrayBlockingQueue.DelayQueue.LinkedBlockingQueue.Priorit ...

随机推荐

  1. Ural 2064:Caterpillars(思维暴力)

    http://acm.timus.ru/problem.aspx?space=1&num=2064 题意:有n只虫子在爬树,每个虫子往上爬ti距离后会往下掉落ti距离,每爬一个单位距离耗费一个 ...

  2. 大规模SDN云计算数据中心组网的架构设计

    本文首先分析了在大规模SDN数据中心组网中遇到的问题.一方面Underlay底层组网规模受限于设备实际的转发能力和端口密度,单一Spine-leaf的Fabric架构无法满足大规模组网的需求:另一方面 ...

  3. scrapy基础知识之 scrapy 三种模拟登录策略:

    注意:模拟登陆时,必须保证settings.py里的 COOKIES_ENABLED (Cookies中间件) 处于开启状态 COOKIES_ENABLED = True或 # COOKIES_ENA ...

  4. 2017普及组D1T3 洛谷P3956 棋盘

    2017普及组D1T3 洛谷P3956 棋盘 原题 题目描述 有一个m×m的棋盘,棋盘上每一个格子可能是红色.黄色或没有任何颜色的.你现在要从棋盘的最左上角走到棋盘的最右下角. 任何一个时刻,你所站在 ...

  5. 深入学习Spring框架(三)- AOP面向切面

    1.什么是AOP? AOP为 Aspect Oriented Programming 的缩写,即面向切面编程, 通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术..AOP是OOP的延续, ...

  6. 基于SpringBoot的Web API快速开发基础框架

    其实还是很因为懒,才会有这个案例项目的产生,每次开启一个终端的小服务都要整理一次框架,造成重复的.不必要的.缺乏创造性的劳动,SO,本着可以用.用着简单的原则上传代码到Github,希望有需要的朋友直 ...

  7. NOI 2011 兔农 题解

    事先声明,本博客代码主要模仿accepoc,且仅针对一般如本博主一样的蒟蒻. 这道题不得不说数据良心,给了75分的水分,但剩下25分真心很难得到,因此我们就来讲一讲这剩下的25分. 首先,有数据可知他 ...

  8. php if语句

    一.前言 if语句 是几乎所有编程语言都有的函数. 当然我们最好的php这么最好的语言也有啦~ 二.搞起! 直接上代码不多哔哔.talk is cheap show me the code 2.1 i ...

  9. 个人永久性免费-Excel催化剂功能第30波-工作表快捷操作(批量创建、命名、排序、工作表目录)

    日常使用Excel过程中,最多的操作无外乎单元格和工作表的操作,单元格的操作在前面已经有详细的辅助功能提供,此篇提供工作表相关的操作.这两项的操作若能有提速,日常大量的工作叠加起来真是省下不少时间. ...

  10. Excel催化剂开源第7波-VSTO开发中Ribbon动态加载菜单

    在VS开发环境中,特别是VSTO的开发,微软已经现成地给开发者准备了设计器模式的功能区开发,相对传统的VBA.ExcelDna和其他方式的COM加载项开发来说,不需要手写xml功能区,直接类似拖拉窗体 ...