CountDownLatch 介绍与举例实现

文章目录

  • 概述
  • 主要方法
  • 举例实现

概述

CountDownLatchJUC 包下的一个重要的并发工具,它是一个线程协同作业的工具,使某些线程一直处于等待状态,直到另外的线程完成任务后再执行。

主要方法

CountDownLatch 主要靠内部的一个计数器来实现同步功能,其过程具有不可重复性

  • countDown() 方法:计数器的值 -1
  • getCount() 方法:获取当前计数器的值
  • await() 方法:当计数器的值不为 0 时,将阻塞所有调用此方法的线程,一直到计数器的值为 0 时,才会唤醒所有被此 CountDownLatch 对象阻塞的线程
  • await(long timeout, TimeUnit unit) 方法:在 await() 方法的基础上,增加了超时时间,以及增加了 boolean 类型的返回值。
    • timeout 的值小于或等于 0 时,将不会等待,若此时计数器的值为 0 ,则返回 true,否则返回 false
    • 当计数器在超时时间内,值归 0 了,则会正常返回 true,并执行唤醒操作。
    • 当超过了这个超时时间,计数器的值还未归 0,则会返回 false,也会执行唤醒操作。

举例实现

现有代码如下:

    static class MyRunnable implements Runnable {private int id;private CountDownLatch countDownLatch;public MyRunnable(int id, CountDownLatch countDownLatch) {this.id = id;this.countDownLatch = countDownLatch;}@Overridepublic void run() {System.out.println("线程 :"+id+"正在执行......");try {Thread.sleep((int)(2000+(Math.random()*1000)));}catch (Exception ignored) {}countDownLatch.countDown();System.out.println("线程 :"+id+"执行结束!!!!!!");}}static class Runnable1 implements Runnable {private CountDownLatch countDownLatch;public Runnable1(CountDownLatch countDownLatch) {this.countDownLatch = countDownLatch;}@Overridepublic void run() {System.out.println("线程 Runnable 1 开始执行, 需要等到 CountDownLatch 的计数为0时才会执行下一步操作");try {countDownLatch.await();System.out.println("线程 Runnable 1 终于执行完毕, 此时 CountDownLatch 中的计数为: "+countDownLatch.getCount());} catch (InterruptedException e) {e.printStackTrace();}}}public static void main(String[] args) throws InterruptedException {CountDownLatch countDownLatch = new CountDownLatch(5);new Thread(new Runnable1(countDownLatch)).start();for (int i = 0;i<5;i++) {new Thread(new MyRunnable(i, countDownLatch)).start();}countDownLatch.await();System.out.println("全部线程执行结束, 现在主线程可以开始执行下一步操作, 此时 CountDownLatch 中的计数为: "+countDownLatch.getCount());}

代码运行结果为:

线程 Runnable 1 开始执行, 需要等到 CountDownLatch 的计数为0时才会执行下一步操作
线程 :0正在执行......
线程 :2正在执行......
线程 :3正在执行......
线程 :4正在执行......
线程 :1正在执行......
线程 :3执行结束!!!!!!
线程 :2执行结束!!!!!!
线程 :1执行结束!!!!!!
线程 :0执行结束!!!!!!
线程 :4执行结束!!!!!!
线程 Runnable 1 终于执行完毕, 此时 CountDownLatch 中的计数为: 0
全部线程执行结束, 现在主线程可以开始执行下一步操作, 此时 CountDownLatch 中的计数为: 0

可以看到,Runnable1 中的 run() 方法中的第一行打印语句最先执行,随后调用 countDownLatch.await() 方法后即被阻塞 ,其后一直等到所有的 MyRunnable 线程都执行结束后(即 CountDownLatch 的内部计数器值为 0 时),第二行打印语句才被执行。主线程中的打印语句亦如此。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/557310.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

identity_insert 如何改为on_十分钟教你如何快速提高Laya构建速度,还不快来康康?...

前言如何快速提高Laya构建速度 微信小游戏推出之后&#xff0c;很多公司也相应的进入到微信小游戏这个领域&#xff0c;现在市场上的游戏开发引擎&#xff0c;如Cocos、Egret、Laya都对小游戏有了很好的兼容性。而在实际开发中&#xff0c;如何提高Laya的构建速度&#xff0c;是…

mysql数据库中数据类型的长度

mysql数据库中数据类型的长度 在mysql中新建数据表的时候会有长度一说&#xff0c;其实用建表语句建数据表的时候也有涉及 例如&#xff1a; CREATE TABLE user( uid int(4), name varchar(255), passward varchar(20) birthday data ) 不知道你有没有注意这个数据类型…

Iterator 和 ListIterator 的区别

概述 Iterator 和 ListIterator 都是迭代器&#xff0c;都可以用来遍历 List&#xff0c;ListIterator 还继承自 Iterator。 区别 Iterator 只能用于顺序遍历&#xff0c;且只能删除元素ListIterator 可以顺序或者反序遍历ListIterator 可以增加&#xff08;add(E e) 方法&a…

二下语文书电子课本_小学生语文成绩好,不是靠补课,把课本吃透,才是高效学习方法...

关注语文教学发展&#xff0c;解决语文学习困惑。对于基础差、语文学习能力差的同学&#xff0c;我不建议去补课。但是家长说&#xff0c;不补课怎么办呢&#xff1f;我们也没有时间和耐心去给孩子辅导&#xff0c;又怕讲错了&#xff0c;还是让老师讲好。尽管家长们有这个意识…

Java面试——MyBatis系列总结

文章目录&#xff1a; 1.MyBatis是什么&#xff1f; 2.JDBC编程有哪些缺陷&#xff1f;MyBatis又是如何改进的&#xff1f; 3.MyBatis与Hibernate的区别在哪&#xff1f; 4.MyBatis的优缺点 5.请说说MyBatis的工作原理 6.MyBatis的架构设计是怎样的&#xff1f; 7.#{}和…

包装类型与基本类型的装箱与拆箱操作

文章目录概述Boolean 与 booleanCharacter 与 charByte 与 byteShort 与 shortInteger 与 intFloat 与 floatDouble 与 doubleLong 与 long总结概述 基本类型与包装类型&#xff0c;存在相互转化的关系。 基本类型转为包装类型这个过程&#xff0c;被称之为装箱包装类型转为基…

机器人炒饭小块头一一_小块头机器人炒饭:全智能流程,炒饭芬芳独具

在我的生活里&#xff0c;没有什么不开心的事情是一顿炒饭解决不了的&#xff0c;实在不行就两顿。把前一天剩出来的隔夜饭放到锅里和家里的食材进行组合、翻炒&#xff0c;就可以千变万化&#xff0c;方便好吃又管饱。小块头茶油炒饭&#xff0c;是一份易拉罐材质独立包装的炒…

Java面试——Spring系列总结

文章目录&#xff1a; 1.什么是Spring&#xff1f; 2.Spring由哪些模块组成&#xff1f; 3.Spring中都用到了哪些设计模式&#xff1f; 4.什么是Spring IOC容器&#xff1f;有什么作用&#xff1f; 5.Spring IoC的实现机制 6.BeanFactory 和 ApplicationContext有什么区别…

gateway 过滤器执行顺序_spring boot gateway 过滤器的执行顺序

前言学习官方文档&#xff0c;发现对于过滤器有分为三类默认过滤器自定义过滤全局过滤器于是就有一个疑问&#xff0c;关于这些过滤器的访问顺序是怎样的&#xff0c;今天就以一个demo来进行测试准备阶段过滤器工厂类以此为模板&#xff0c;复制出几份就可以了&#xff0c;注意…

Java 线程状态流转

Java 线程一共有 6 种状态&#xff1a; NEW&#xff1a;新建状态&#xff0c;当一个线程被创建完成&#xff0c;还没有调用 start() 方法时&#xff0c;是这种状态。RUNNABLE&#xff1a;可运行状态&#xff0c;当一个线程正在正常地执行 run() 中的代码时&#xff0c;是这种状…

达梦数据库导入oracle数据_达梦数据库和oracle数据的一些区别

近期我在考达梦的dca发现有一些和oracle不同的地方&#xff0c;由于我是oracleDBA在维护达梦数据库的时候有需要注意的地方&#xff0c;现在分享一下2个数据库的一些区别。1、登陆的区别oracle:如果sys的密码忘记可以用操作系统验证方式登陆修改密码。dm:达梦数据库如果忘记了s…

Fail-fast 和 Fail-safe 机制

fail-fast 和 fail-safe 的区别 从字面意思来看 fail-fast 是快速失败&#xff0c;fail-safe 是安全失败&#xff0c;这都是集合类对于并发读写时的一种应对机制。 fail-fast&#xff0c;广泛应用于 java.util 下的集合类中&#xff0c;其机制为在使用迭代器遍历的过程中&…

【java8新特性】——lambda表达式与函数式接口详解(一)

一、简介 java8于2014年发布&#xff0c;相比于java7&#xff0c;java8新增了非常多的特性&#xff0c;如lambda表达式、函数式接口、方法引用、默认方法、新工具&#xff08;编译工具&#xff09;、Stream API、Date Time API、Optional等 。 当前很多公司的老产品依然使用的…

详解 ConcurrentHashMap

文章目录ConcurrentHashMap 的底层数据结构?ConcurrentHashMap 的带参构造方法的流程&#xff1f;ConcurrentHashMap 的 put 方法的流程?ConcurrentHashMap addCount 方法的流程是怎样的呢&#xff1f;ConcurrentHashMap transfer 方法的流程是怎样的呢&#xff1f;Concurren…

js 二叉树图形_js数据结构和算法(三)二叉树

二叉树的概念二叉树(Binary Tree)是n(n>0)个结点的有限集合&#xff0c;该集合或者为空集(空二叉树)&#xff0c;或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。二叉树的特点每个结点最多有两棵子树&#xff0c;所以二叉树中不存在度大于…

【java8新特性】——Stream API详解(二)

一、简介 java8新添加了一个特性&#xff1a;流Stream。Stream让开发者能够以一种声明的方式处理数据源&#xff08;集合、数组等&#xff09;&#xff0c;它专注于对数据源进行各种高效的聚合操作&#xff08;aggregate operation&#xff09;和大批量数据操作 (bulk data op…

Spring bean 不被 GC 的真正原因

概述 自从开始接触 Spring 之后&#xff0c;一直以来都在思考一个问题&#xff0c;在 Spring 应用的运行过程中&#xff0c;为什么这些 bean 不会被回收&#xff1f; 今天深入探究了这个问题之后&#xff0c;才有了答案。 思考点 大家都知道&#xff0c;一个 bean 会不会被回…

ad域时间源配置_域控制器server2012时间同步NTP配置

一、域控配置1.修改注册表&#xff0c;设置域控服务器名称2.设置组策略&#xff0c;启动NTP服务器3.域策略中设置windows time服务自动启动二、服务端配置(Ntp服务器&#xff0c;客户端将根据这台服务器的时间进行同步)1、微软键R键&#xff0c;进入“运行”&#xff0c;输入“…

【java8新特性】——Optional详解(三)

一、简介 Optional类是Java8为了解决null值判断问题&#xff0c;借鉴google guava类库的Optional类而引入的一个同名Optional类&#xff0c;使用Optional类可以避免显式的null值判断&#xff08;null的防御性检查&#xff09;&#xff0c;避免null导致的NPE&#xff08;NullPo…

不使用 + 和 - 运算符计算两整数之和

问题概述 不使用运算符 和 -&#xff0c;计算两整数之和 思考 不使用 和 - &#xff0c;那就只能想到用位运算来处理了。思路如下&#xff1a; 两数进行 ^&#xff08;异或运算&#xff09;&#xff0c;可以得到两个数在相同位上数值不同的相加结果两数进行 &&#x…