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

  用给定的计数 初始化 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()+"名参与者");
}
@Override
public 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;
} @Override
public 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() 成功返回的操作。

CountDownLacth详解的更多相关文章

  1. Linq之旅:Linq入门详解(Linq to Objects)

    示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...

  2. 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)

    一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...

  3. EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解

    前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...

  4. Java 字符串格式化详解

    Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...

  5. Android Notification 详解(一)——基本操作

    Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...

  6. Android Notification 详解——基本操作

    Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...

  7. Git初探--笔记整理和Git命令详解

    几个重要的概念 首先先明确几个概念: WorkPlace : 工作区 Index: 暂存区 Repository: 本地仓库/版本库 Remote: 远程仓库 当在Remote(如Github)上面c ...

  8. Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)

    Android XML shape 标签使用详解   一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...

  9. Node.js npm 详解

    一.npm简介 安装npm请阅读我之前的文章Hello Node中npm安装那一部分,不过只介绍了linux平台,如果是其它平台,有前辈写了更加详细的介绍. npm的全称:Node Package M ...

随机推荐

  1. Unity无缝循环世界实现

    一年前曾经碰到过已无限世界为题材的游戏开发比赛,虽然对比赛没有兴趣,但是对这个题材倒是有点想法.如何通过unity3d实现无缝的循环世界呢. 有一种想法是动态生成,一块场景一块场景进行动态加载.(做过 ...

  2. Unity - 通过降低精度减少动画文件的大小

    Animation是Unity中的动画文件,主要内容由一个个关键帧数据构成.通过将Unity的资源序列化方式调整为Text,就可以以文本方式查看动画文件.通过菜单项Edit -> Project ...

  3. C#研究OpenXML之路(4-使用第三方库)

    一.悲催的OpenXML操作 学习并使用了一段时间的OpenXML,感觉用这个来操作Excel文件真是一件非常悲催的事情,由于我自己比较熟悉Excel COM的操作,但到了OpenXML中发现,之前所 ...

  4. CF #401 (Div. 2) E. Hanoi Factory (栈+贪心)

    题意:给你一堆汉诺塔的盘子,设内半径为a,设外半径为b,高度为h,如果bj ≤ bi 同时bj > ai 我们就认为i盘子能落在在j盘子上,问你最高能落多高 思路:一看题意我们就能想到贪心,首先 ...

  5. Java中执行shell笔记

    在java中执行shell有好几种方式:第一种(exec)方式一 public static synchronized void runshell2() {    File superuser = n ...

  6. 【算法功底】LeetCode 292 Nim Game

    You are playing the following Nim Game with your friend: There is a heap of stones on the table, eac ...

  7. ajax 第四步

    Ajax和XMLHttpRequest详述 (2011-12-10 16:40:23) 转载▼ 标签: ajax xmlhttprequest 分类: Web Ajax:Asynchronous Ja ...

  8. 移动端emoji图标的存储和显示

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/6694595.html 一.emoji是什么 绘文字(日语:絵文字/えもじ emoji)是日本在无线通信中所使用的 ...

  9. redis intset(整数集合)

    redis intset (整数集合) 概述 intset 是集合的底层实现结构之一 intset 集合只包含整数 intset 自升级 intset 整数集合是有序的 intset 结构 结构 // ...

  10. 求解释一个蛋疼的bug

     大婶儿们出来解决个问题,看看有碰见过的没 截图中的 if (order.EShopOrder_PayStatus == 0 && order.EShopOrder_Status == ...