CountDownLacth详解

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

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

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

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

  在接下来给出视频会议的例子来说明CountDownLacth的用法,视频会议需要等待多有的参与者都到会后才能开始。视频会议:

public class VedioConference implements Runnable{private CountDownLatch countDownLatch;public VedioConference(int count) {this.countDownLatch = new CountDownLatch(count);}public void arrive(String name){System.out.println("参与者:"+name+"到达");countDownLatch.countDown();System.out.println("视频会议还需要等待:"+countDownLatch.getCount()+"名参与者");}@Overridepublic void run() {try {System.out.println("视频会议共有 :"+countDownLatch.getCount()+"名参与者");countDownLatch.await();System.out.println("所有参与者都已将到达 ");System.out.println("开始会议...");} catch (InterruptedException e) {e.printStackTrace();}}
}

  参与者:

public class Participant implements Runnable {private VedioConference conference;private String name;public Participant(VedioConference conference, String name) {this.conference = conference;this.name = name;}@Overridepublic void run() {try {//线程随机休息一段时间Thread.currentThread().sleep((int)(Math.random()*10));} catch (InterruptedException e) {e.printStackTrace();}//调用arrive()表示参与者已经到达
        conference.arrive(name);}
}

测试类:

public class Main {public static void main(String[] args) {VedioConference conference=new VedioConference(5);Thread conThread=new Thread(conference);conThread.start();for (int i = 0; i <5; i++) {Participant participant=new Participant(conference, "participant"+i);Thread thread=new Thread(participant);thread.start();}}
}

  运行结果:

视频会议共有 :5名参与者
参与者:participant2到达
视频会议还需要等待:4名参与者
参与者:participant3到达
视频会议还需要等待:3名参与者
参与者:participant1到达
视频会议还需要等待:2名参与者
参与者:participant4到达
视频会议还需要等待:1名参与者
参与者:participant0到达
视频会议还需要等待:0名参与者
所有参与者都已将到达 
开始会议...

  内存一致性效果:线程中调用 countDown() 之前的操作happen-before紧跟在从另一个线程中对应 await() 成功返回的操作。

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

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

相关文章

怎么用计算机画正弦函数图像,几何画板如何绘制正弦函数图象

考虑到三角函数问题描点的实际困难&#xff0c;教材表述时借助正弦线利用几何法利用三角函数线作正弦函数图象&#xff0c;但由此带来的困难是如何实现这种效果。如果能让三角函数线动起来&#xff0c;那将会更加直观易懂。几何画板作为使用专业的几何绘图软件&#xff0c;自带…

C/C++常见指针错误 and 内存访问越界

1) 内存分配未成功&#xff0c;却使用了它。 编程新手常犯这种错误&#xff0c;因为他们没有意识到内存分配会不成功。常用解决办法是&#xff0c;在使用内存之前检查指针是否为NULL。如果指针p是函数的参数&#xff0c;那么在函数的入口处用assert(p!NULL)进行检查。如果是用m…

C#将dll打包到程序中

直接进入主题 先来看一个栗子,假设现在有一个第三方dll namespace TestLibrary1 {public class Test{public void Point(){Console.WriteLine("aaabbbccc");}} } TestLibrary1.dll在项目中引用,然后调用其中的方法Test,将输出aaabbbccc using System;namespace Conso…

Exchange 2016集成ADRMS系列-12:域内outlook 2010客户端测试

接下来&#xff0c;我们来到域内安装了office 2010的机器上进行测试。 首先我们在客户端上强制刷新组策略&#xff0c;把我们刚才设置的策略刷新下来。 然后我们可以运行gpresult /h result.html来看看策略是不是已经下来了。 策略下来之后&#xff0c;我们打开客户端上面的out…

如何用css和HTML结合画熊,结合伪元素实现的纯CSS3高级图形绘制

自小编上次整理了一些基础图形的绘制方法之后&#xff0c;大家都纷纷表示对css3的绘图技巧学习很有帮助。虽说万变不离其宗&#xff0c;再复杂的图形也可以用最简单的三角形或者圆弧组合出来&#xff0c;但仍有不少朋友反映&#xff0c;学会基本图形也不懂得怎样组合&#xff0…

基于C++中常见内存错误的总结

在系统开发过程中出现的bug相对而言是比较好解决的&#xff0c;花费在这个上面的调试代价不是很大&#xff0c;但是在系统集成后的bug往往是难以定位的bug&#xff08;最好方式是打桩&#xff0c;通过打桩可以初步锁定出错的位置&#xff0c;如&#xff1a;进入函数前打印日志&…

UWP开发细节记录:判断文件类型

StorageFile.ContentType 属性&#xff0c;是 string 类型&#xff0c;用来表示文件内容的 MIME 类型。例如&#xff0c;音乐文件可能有 "audio/mpeg" MIME 类型。(MSDN) MIME 类型的定义可以下面的链接找到&#xff1a; MIME Types - http://blogs.msdn.com/b/jaime…

Creating Apps With Material Design —— Creating Lists and Cards

转载请注明 http://blog.csdn.net/eclipsexys 翻译自Developer Android。时间仓促&#xff0c;有翻译问题请留言指出&#xff0c;谢谢创建Lisst和Cards在你的应用程序创建复杂的清单&#xff0c;并与材料设计风格卡。您能够使用RecyclerView和CardView部件。 创建RecyclerView …

计算机考研自命题院校双非,计算机考研408——951211院校汇总

众所周知&#xff0c;计算机考研408计算机学科基础综合难度与一些顶尖985自命题相比也是不落下风的&#xff0c;号称最难工科专业课(请忽略912这种殿堂级别的)&#xff0c;难度大、知识点庞杂也是前些年众多高校纷纷脱离408统考的原因。19年的计算机类考研火到爆炸&#xff0c;…

Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable)

第一次鼓捣Docker&#xff0c;- - ! 报错&#xff1a; serverubuntu1987:~$ sudo apt-get update E: Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable) E: Unable to lock directory /var/lib/apt/lists/ 转载于:https://www.cnblo…

新手学Struts(一)----JSP+Servlet讲解MVC实现原理

MVC基本原理一个简单的例子改良的例子Struts基本流程的实现最近在学SSH&#xff08;Struts HibernateSpring)&#xff0c;这也算是一个比较经典的框架了&#xff0c;之前都是看人家大牛说这个框架&#xff0c;那个框架&#xff0c;说的真溜&#xff0c;自己也是佩服的五体投地啊…

中国首台千万亿次超级计算机,中国首台千万亿次超级计算机首批设备开始试用...

新华社天津&#xff11;月&#xff11;&#xff13;日电(记者 周润健 罗捷)记者&#xff11;&#xff13;日从国家超级计算天津中心获悉&#xff0c;中国首台千万亿次超级计算机“天河一号”首批设备调试工作结束&#xff0c;具备向客户提供服务的条件&#xff0c;“天河一号”…

Outlook Express 错误代码表

错误码 意义 一般 0x800C01310x800C013E 可能是 Folders.dbx 档案属性错误或损坏. 0x800CCC00 身份验证&#xff08;Authentication&#xff09;未载入 0x800CCC01 认证&#xff08;Certificate&#xff09;内容错误 0x800CCC02 认证日期错误 0x800CCC03 使用者已联机 0x800CCC…

USB设备枚举过程

&#xff08;1&#xff09;集线器检测新设备 &#xff08;集线器的英文称为“Hub”&#xff09;主机集线器监视着每个端口的信号电压&#xff0c;当有新设备接入时便可觉察。&#xff08;集线器端口的两根信号线的每一根都有15kΩ的下拉电阻&#xff0c;而每一个设备在D都有一个…

windows下apache+php+mysql 环境配置方法

转自&#xff1a;http://www.jb51.net/article/30128.htm 一 准备 1 下载apache http://httpd.apache.org/download.cgi#apache24 httpd-2.2.22-win32-x86-openssl-0.9.8t.msiopenssl表示带有openssl模块&#xff0c;利用openssl可给Apache配置SSL安全链接 2 下载php http://wi…

计算机工作原理 公开课,《计算机的基本工作原理》公开课材料(11页)-原创力文档...

《计算机系统的组成》教学设计教师&#xff1a;吴军一、学习者分析初一的学生&#xff0c;具有活泼好动的特点&#xff0c;怀着对初中生活的憧憬来到一个新的环境里&#xff0c;对每样事物都充满着好奇&#xff0c;都想去探个究竟。随着社会的进步&#xff0c; 计算机的使用范围…

USB枚举过程分析

1. 枚举是什么? 枚举就是从设备读取一些信息&#xff0c;知道设备是什么样的设备&#xff0c;如何进行通信&#xff0c;这样主机就可以根据这些信息来加载合适的驱动程序。调试USB设备&#xff0c;很重要的一点就是USB的枚举过程&#xff0c;只要枚举成功了&#xff0c;那么就…

linux -- read(), write()

read()函数 2011-03-23 16:28:37| 分类&#xff1a; linux | 标签&#xff1a; |字号大中小 订阅 read函数从打开的设备或文件中读取数据。 #include <unistd.h> ssize_t read(int fd, void *buf, size_t count); 返回值&#xff1a;成功返回读取的字节数&…

jquery的$.extend、$.fn.extend、 jQuery.extend( target, object1, [objectN])作用及区别

jQuery为开发插件提拱了两个方法&#xff0c;分别是&#xff1a; jQuery.fn.extend();jQuery.extend(); 虽然 javascript 没有明确的类的概念&#xff0c;但是用类来理解它&#xff0c;会更方便。 jQuery便是一个封装得非常好的类&#xff0c;比如我们用 语句 $("#btn1&…

CATia对计算机配置要求,【2人回答】求CATIA对电脑的详细配置要求-3D溜溜网

回答&#xff1a;1、内存要求在32G和64G之间。2、硬盘要求选择7200转机械硬盘&#xff0c;4k以上分辨&#xff0c;就选择SSD固态硬盘。3、CPU要求睿频在4.1GHZ以上&#xff0c;核心在6和8核之间。4、显卡要求显存在6GB和11GB之间&#xff0c;位宽要求在192bit和384bit之间。5、…