一、什么是countDownlatch

CountDownLatch是一个同步工具类,它通过一个计数器来实现的,初始值为线程的数量。每当一个线程完成了自己的任务,计数器的值就相应得减1。当计数器到达0时,表示所有的线程都已执行完毕,然后在等待的线程就可以恢复执行任务。

二、方法详解

  1. CountDownLatch(int count):count为计数器的初始值(一般需要多少个线程执行,count就设为几)。
  2. countDown(): 每调用一次计数器值-1,直到count被减为0,代表所有线程全部执行完毕。
  3. getCount():获取当前计数器的值。
  4. await(): 等待计数器变为0,即等待所有异步线程执行完毕。
  5. boolean await(long timeout, TimeUnit unit): 此方法与await()区别:
    ①此方法至多会等待指定的时间,超时后会自动唤醒,若 timeout 小于等于零,则不会等待
    ②boolean 类型返回值:若计数器变为零了,则返回 true;若指定的等待时间过去了,则返回 false

三、CountDownLatch应用场景

1. 某个线程需要在其他n个线程执行完毕后再向下执行
2. 多个线程并行执行同一个任务,提高响应速度

四、CountDownLatch代码示例

/*** @author liuhuifang* @date 2022/5/26 11:31*/
public class CountDownLaunchTest {public static void main(String[] args) throws InterruptedException {List list = new ArrayList();for(int i = 1; i<=100; i++){list.add(i);}Long start = System.currentTimeMillis();for(int i = 0; i<list.size(); i++){Thread.sleep(100);}System.out.println("=====同步执行:耗时"+(System.currentTimeMillis()-start)+"毫秒======");Long start1 = System.currentTimeMillis();CountDownLatch latch = new CountDownLatch(10);for(int i = 0; i<latch.getCount(); i++){new Thread(new Test(latch, i, list)).start();}latch.await();System.out.println("=====异步执行:耗时"+(System.currentTimeMillis()-start1)+"毫秒======");}static class Test implements Runnable{private CountDownLatch latch;private int i;private List list;Test(CountDownLatch latch, int i, List list){this.latch = latch;this.i = i;this.list = list;}@SneakyThrows@Overridepublic void run() {for(int a = i*10; a<(i+1)*10; a++){// 执行任务逻辑Thread.sleep(100);}latch.countDown();}}
}

执行结果:

:如果多个线程并行执行一个任务,则初始count值必须与启动线程数保持一致,即count为10,则必须开启10 个异步线程

CountDownLatch详解以及用法示例相关推荐

  1. PHP 全局变量 - 9 个超全局变量详解与用法示例

    超全局变量 在 PHP 4.1.0 中引入,是在全部作用域中始终可用的内置变量. PHP 中的许多预定义变量都是"超全局的",这意味着它们在一个脚本的全部作用域中都可用.在函数或方 ...

  2. python字典的用法_Python字典的用法详解(附示例)

    本篇文章给大家带来的内容是关于Python字典的用法详解(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 字典的表现形式为:{key:value},键和值之间用冒号分隔,每个 ...

  3. OpenCV Mat类详解和用法(官网原文)

    参考文章:OpenCV Mat类详解和用法 我马克一下,日后更 官网原文链接:https://docs.opencv.org/3.2.0/d6/d6d/tutorial_mat_the_basic_i ...

  4. java集合框架的结构_集合框架(Collections Framework)详解及代码示例

    简介 集合和数组的区别: 数组存储基础数据类型,且每一个数组都只能存储一种数据类型的数据,空间不可变. 集合存储对象,一个集合中可以存储多种类型的对象.空间可变. 严格地说,集合是存储对象的引用,每个 ...

  5. windows下创建进程,CreateProcess()详解及用法

    windows下想要创建一个子进程不如linux的fork函数来得方便,通过CreateProcess函数创建一个新的进程,函数的定义如下 [cpp]  view plain copy BOOL Cr ...

  6. OpenCV Mat类详解和用法

    OpenCV Mat类详解和用法 我们有多种方法可以获得从现实世界的数字图像:数码相机.扫描仪.计算机体层摄影或磁共振成像就是其中的几种.在每种情况下我们(人类)看到了什么是图像.但是,转换图像到我们 ...

  7. 【ADB 操作命令详解及用法大全(非常全)】

    ADB操作命令详解及用法大全 一.ADB是什么?   ADB,即 Android Debug Bridge 是一种允许模拟器或已连接的 Android 设备进行通信的命令行工具,它可为各种设备操作提供 ...

  8. java学习 类变量 类方法_这篇文章主要介绍了JAVA类变量及类方法代码实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下类变量(...

    这篇文章主要介绍了JAVA类变量及类方法代码实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 类变量(static) 类变量是该类的所有对象共 ...

  9. Freesurfer recon-all命令详解及使用示例

    Freesurfer recon-all命令详解及使用示例 一.一些名词解释 atlas 模板,带标签的地图 CA Canonical 典型的,规范的(CA Normalize, CA Registe ...

最新文章

  1. Flask实例教程四
  2. java list 查找_java面试之容器
  3. 键盘各个键对应的ASCLL值
  4. 在PowerDesigner中设计概念模型
  5. 面试了100个数据分析候选人以后,我总结出了这些面试问题
  6. spring boot高性能实现二维码扫码登录(中)——Redis版
  7. java integer 值传递_在java中String,对象,Integer(包装类型的)关于引用传递仍是值传递...
  8. C语言实现一个随机测试加减乘除,编写程序:C语言实现一个随堂测试,能进行加减乘除运算...
  9. 读书日记 莫雨 《一个程序员的奋斗史》Java 面试 感悟 程序员
  10. databinding包名不能大写?——不改包名解决databinding与包名大写的冲突Android
  11. django学习日志(模板的渲染过程)第八部分:字符串数据转义
  12. java突然无法加载主类_JAVA之中出现无法加载主类的情况解决方法
  13. 吴恩达深度学习笔记(40)-指数加权平均数优化算法
  14. 论文理解记录:The Lottery Ticket Hypothesis
  15. 写给大学时期自己的寄语
  16. 树莓派程序开机自启(尝试过很多终于成了)
  17. mac 类似matlab,10款Mac上科研人员必备的科研工具推荐和下载 | 玩转苹果
  18. 新零售微服务解决方案,打通企业微信、饿了么、美团、京东到家
  19. 腾讯敏感词汇大全_有创意的饰品店名,独一无二的饰品店名大全
  20. matplotlib 绘制心肌模型图方法一:Axes.pie

热门文章

  1. C语言学生管理系统(结构体数组)
  2. cs透视源码c语言,[原始] CS1.6透视插件(非D3D Hook)的简单分析(包括透视源代码)...
  3. PX4模块设计之三十三:Sensors模块
  4. html5输入框自动放大镜,HTML5实现放大镜效果
  5. MoviePy,利用Python自动剪辑tiktok视频
  6. pipeline+sonar
  7. Repeater实例应用
  8. 分享一个好用的直播系统软件(一)
  9. 运动想象脑电信号数据集及其预处理方法
  10. BlackBerry Enterprice Server(BES)---push内容到手持设备的流程