CountDownLatch官方文档

一、原理

  CountDownLatch是一个非常实用的多线程控制工具类。Count Down在英文中意为倒计时,Latch意为门闩,可以简单的将CountDownLatch称为倒计时器。门闩的含义是:把门锁起来,不让里面的线程跑出来。因此,这个工具通常用来控制线程等待,它可以让一个线程等待知道倒计时结束,再开始执行。

  CountDownLatch内部维护着一个count计数,只不过对这个计数器的操作都是原子操作,同时只能有一个线程去操作这个计数器。CountDownLatch通过构造函数传入一个初始计数值,调用者可以通过调用CounDownLatch对象的countDown()方法,来使计数减1;如果调用对象上的await()方法,那么调用者就会一直阻塞在这里,直到别人通过countDown方法,将计数减到0,才可以继续执行。

  CountDownLatch的一种典型应用场景是火箭发射。在火箭发射前,为了保证万无一失,往往要进行各项设备、仪器的检查。只有等所有的检查完毕后,引擎才能点火。这种场景就非常适合使用CountDownLatch。它可以使得点火线程等待所有检查线程全部完成后再执行。

二、API

主要方法

  • public CountDownLatch(int count);

    构造方法参数指定了计数的次数

  • public void countDown();

    当前线程调用此方法,则计数减一

  • public void await() throws InterruptedException

    调用此方法会一直阻塞当前线程,直到计时器的值为0

三、用法

CountDownLatch的一种典型用法是:

a group of worker threads use two countdown latches(一组工作线程使用两个CountDownLatch)。

Sample usage: a group of worker threads use two countdown latches(一组工作线程使用两个CountDownLatch):

  • The first is a start signal that prevents any worker from proceeding until the driver is ready for them to proceed;
  • The second is a completion signal that allows the driver to wait until all workers have completed

下面以一个Demo来说明CountDownLatch的使用。

程序功能:模拟多线程下载,合并线程等到所有下载任务完成便开始合并。

/*** CountDownLatch的典型用法2* 代码功能:使用多个下载线程实现下载,等到所有任务完成后合并线程开始合并。* * @author lp**/
public class CountDownLatchDemo2 {public static void main(String[] args) throws InterruptedException {int N = 8;CountDownLatch startSignal = new CountDownLatch(1);//startSignal控制开始CountDownLatch doneSignal = new CountDownLatch(N);//
ExecutorService executor = Executors.newFixedThreadPool(N + 1);// 8个下载线程,1个合并线程// let all threads proceed
        startSignal.countDown();// N个下载任务开始执行for (int i = 0; i < N; ++i) {executor.execute(new DownloadRunnable(startSignal,doneSignal, i));}// wait for all to finishdoneSignal.await();//阻塞,直到计数器为0// 执行合并任务executor.execute(new MergeRunnable());executor.shutdown();}
}/*** 下载线程*/
class DownloadRunnable implements Runnable {private final CountDownLatch startSignal;private final CountDownLatch doneSignal;private final int i;public DownloadRunnable(CountDownLatch startSignal, CountDownLatch doneSignal, int i) {this.startSignal = startSignal;this.doneSignal = doneSignal;this.i = i;}public void run() {try {startSignal.await();//当前线程等待
            doDownload(i);doneSignal.countDown();} catch (InterruptedException e) {e.printStackTrace();}}private void doDownload(int i) {System.out.println("Thead:" + i + "下载完成");}
}

Another typical usage would be to divide a problem into N parts, describe each part with a Runnable that executes that portion and counts down on the latch, and queue all the Runnables to an Executor. When all sub-parts are complete, the coordinating thread will be able to pass through await. (When threads must repeatedly count down in this way, instead use a CyclicBarrier.)

另外一种典型的用法是:将一个问题分解成N部分,用Runnable来描述每一部分任务,每个Runnable执行完后将latch数减1,而且要将所有的Runnable都加入到Executor中。当所有子部分任务完成时,协调线程经过await后能够开始执行。(当线程必须可重复性的倒计时时,请使用CyclicBarrier代替)

/*** CountDownLatch的典型用法1* 代码功能:模拟多线程下载功能-使用多个下载线程实现下载,等到所有任务完成后合并线程开始合并。* * @author lp**/
public class CountDownLatchDemo {public static void main(String[] args) throws InterruptedException {int N = 8;CountDownLatch doneSignal = new CountDownLatch(N);// 计数器从N开始倒数ExecutorService executor = Executors.newFixedThreadPool(N + 1);// N个下载线程,1个合并线程// N个下载任务开始执行for (int i = 0; i < N; ++i) {executor.execute(new DownloadRunnable(doneSignal, i));}// wait for all to finishdoneSignal.await();//阻塞,直到计数器为0// 执行合并任务executor.execute(new MergeRunnable());executor.shutdown();}
}/*** 下载线程*/
class DownloadRunnable implements Runnable {private final CountDownLatch doneSignal;private final int i;DownloadRunnable(CountDownLatch doneSignal, int i) {this.doneSignal = doneSignal;this.i = i;}public void run() {doDownload(i);doneSignal.countDown();}private void doDownload(int i) {System.out.println("Thead:" + i + "下载完成");}
}/*** 合并线程*/
class MergeRunnable implements Runnable{@Overridepublic void run() {doMerge();}private void doMerge(){System.out.println("合并线程完成合并");}}

转载于:https://www.cnblogs.com/rouqinglangzi/p/7058896.html

线程工具类 - CountDownLatch(倒计时器)相关推荐

  1. 【待完成】并发包下常用到线程工具类汇总

    文章目录 并发容器 BlockingQueue ArrayBlockingQueue LinkedBlockingQueue PriorityBlocking DelayQueue Synchrono ...

  2. 14、详解java同步工具类CountDownLatch

    这篇文章主要讲解java中一个比较常用的同步工具类CountDownLatch,不管是在工作还是面试中都比较常见.我们将通过案例来进行讲解分析. 一.定义 CountDownLatch的作用很简单,就 ...

  3. 线程工具类(根据电脑逻辑处理器个数控制同时运行的线程个数)

    代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syst ...

  4. JAVA同步工具类——CountDownLatch

    闭锁 在学习CountDownLatch之前,让我们先了解一下闭锁的概念. 闭锁是一种同步工具类,可以延迟线程的进度直到其到达终止状态:闭锁的作用相当于一扇门,在闭锁到达结束状态之前,这扇门一直是关闭 ...

  5. JAVA并发:并发工具类CountDownLatch、CyclicBarrier、Semaphore使用及源码分析

    在 JUC 下包含了一些常用的同步工具类,今天就来详细介绍一下,CountDownLatch,CyclicBarrier,Semaphore 的使用方法以及它们之间的区别. 1 CountDownLa ...

  6. Java JUC工具类--CountDownLatch

    CountDownLatch:用于监听某些初始化操作,并且线程进行阻塞,等初始化执行完毕后,通知主线程继续工作执行 package com.example.core.juc;import java.u ...

  7. 【高并发】JUC中等待多线程完成的工具类CountDownLatch

    文章目录 1.概述 2.CountDownLatch介绍 3.案例 3.1 示例1:一个简单的示例 3.1 示例2:等待指定的时间 3.1 示例3:2个CountDown结合使用的示例 6.源码 6. ...

  8. unity工具类篇 unity 计时器

    一.计时器的主要功能 在规定时间内倒计时 显示倒计时时间 显示正计时时间 暂停.继续 时间速率影响 获取倒计时剩余时间 倒计时结束的回调 二.计时器实现 using UnityEngine;publi ...

  9. android自定义线程池工具类,妈妈再也不用担心你不会使用线程池了(ThreadUtils)...

    为什么要用线程池 使用线程池管理线程有如下优点:降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗. 提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行. 提高线程的可 ...

最新文章

  1. mysql异步扩展_基于Swoole扩展开发异步高性能的MySQL代理服务器
  2. 回顾游戏中的设计模式:策略模式vs抽象工厂
  3. centos 编译nginx php mariadb,centos7安装nginx+mariadb+php-fpm
  4. 3、Finished with error: FormatException: Bad UTF-8 encoding 0xc3 (at offset 169)
  5. js排序算法详解-快速排序
  6. java创建项目出现怎么办_maven创建项目后main/java missing的解决方法
  7. ASIHTTPRequest
  8. android checkboxpreference属性,Android CheckBoxPreference Default Value
  9. 梦三国则么修改服务器时间,梦三国如何窗口,梦三国设置
  10. 骑士CMSgetshell复现
  11. 【XLPNet车牌识别算法】第一章 序
  12. 为啥linux识别螃蟹驱动,螃蟹卡 RTL8168 更新驱动解决 BBR 单线程限速
  13. 荣耀v40和华为nova8参数对比哪个好 华为nova8和荣耀v40的区别
  14. 6-3 每个单词的首字母改为大写 (10 分)
  15. 使用图生成多任务模型缩小基于靶标和基于细胞的药物发现之间的差异
  16. 礼盒抖动动画(CocosCreator)
  17. 这可能是京东考前焦虑最重的一次618
  18. java-php-python-医院挂号管理系统计算机毕业设计
  19. jzoj 1420. 佳肴
  20. html script写布局,scriptmanager

热门文章

  1. jvm面试之 Java内存模型之线程独占部分,线程共享部分,常问问题分析
  2. 深入理解Golang之context
  3. 查询2019-06-20日 和 2019-06-23  每个商品每天的入库情况
  4. upupw 安装thinkcmf 5.0白屏问题
  5. 抽象同步器AQS应用之-- Semaphore、CountDownLatch、CyclicBarrier的介绍
  6. Hadoop入门基础教程 Hadoop之完全分布式环境搭建
  7. Java中文件复制的一个汇总
  8. centos7 搭建apache druid
  9. 视频编辑,4k播放,3D游戏, 阿里云图形工作站,了解一下?
  10. (二)golang数组和切片