CountDownLatch
1.一个同步的辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个、多个线程去一直等待,用给定的计数、初始化“CountDownLatch”。
  由于调用 countDown()方法 ,所以在当前计算到达之前,await()方法会一直处于阻塞状态,之后会释放所有的等待线程,await()方法的所有
  后续调用都将立即返回调用。
  1. public class CountDownLatchTest {
  2. // 模拟了100米赛跑,10名选手已经准备就绪,只等裁判一声令下。当所有人都到达终点时,比赛结束。
  3. public static void main(String[] args) throws InterruptedException {
  4. // 开始的倒数锁
  5. final CountDownLatch begin = new CountDownLatch(1);
  6. // 结束的倒数锁
  7. final CountDownLatch end = new CountDownLatch(10);
  8. // 十名选手
  9. final ExecutorService exec = Executors.newFixedThreadPool(10);
  10. for (int index = 0; index < 10; index++) {
  11. final int NO = index + 1;
  12. Runnable run = new Runnable() {
  13. public void run() {
  14. try {
  15. // 如果当前计数为零,则此方法立即返回。
  16. // 等待
  17. begin.await();
  18. Thread.sleep((long) (Math.random() * 10000));
  19. System.out.println("No." + NO + " arrived");
  20. } catch (InterruptedException e) {
  21. } finally {
  22. // 每个选手到达终点时,end就减一
  23. end.countDown();
  24. }
  25. }
  26. };
  27. exec.submit(run);
  28. }
  29. System.out.println("Game Start");
  30. // begin减一,开始游戏
  31. begin.countDown();
  32. // 等待end变为0,即所有选手到达终点
  33. end.await();
  34. System.out.println("Game Over");
  35. exec.shutdown();
  36. }
  37. }
  38. Game Start
    No.9 arrived
    No.6 arrived
    No.8 arrived
    No.7 arrived
    No.10 arrived
    No.1 arrived
    No.5 arrived
    No.4 arrived
    No.2 arrived
    No.3 arrived
    Game Over

2.需要等待某个条件到达之后才能做后续下一步的业务,同时当前线程完成后也会触发事件,以便进行后面的操作。

10.线程通信CountDownLatch的更多相关文章

  1. 11.线程通信CountDownLatch

    package demo2; import java.util.concurrent.CountDownLatch; /** * Created by liudan on 2017/7/27. */ ...

  2. Java Thread系列(四)线程通信

    Java Thread系列(四)线程通信 一.传统通信 public static void main(String[] args) { //volatile实现两个线程间数据可见性 private ...

  3. Java线程通信

    Java线程通信 螣蛇乘雾,终为土灰. 多个线程协同工作完成某个任务时就会涉及到线程间通信问题.如何使各个线程之间同时执行,顺序执行.交叉执行等. 一.线程同时执行 创建两个线程a和b,两个线程内调用 ...

  4. 第23章 java线程通信——生产者/消费者模型案例

    第23章 java线程通信--生产者/消费者模型案例 1.案例: package com.rocco; /** * 生产者消费者问题,涉及到几个类 * 第一,这个问题本身就是一个类,即主类 * 第二, ...

  5. C# 线程通信 一

    C#多线程通信 using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...

  6. Java 线程通信

    线程通信用来保证线程协调运行,一般在做线程同步的时候才需要考虑线程通信的问题. 1.传统的线程通信 通常利用Objeclt类提供的三个方法: wait() 导致当前线程等待,并释放该同步监视器的锁定, ...

  7. Java核心知识点学习----使用Condition控制线程通信

    一.需求 实现线程间的通信,主线程循环3次后,子线程2循环2次,子线程3循环3次,然后主线程接着循环3次,如此循环3次. 即:A->B->C---A->B->C---A-> ...

  8. .net学习之多线程、线程死锁、线程通信 生产者消费者模式、委托的简单使用、GDI(图形设计接口)常用的方法

    1.多线程简单使用(1)进程是不执行代码的,执行代码的是线程,一个进程默认有一个线程(2)线程默认情况下都是前台线程,要所有的前台线程退出以后程序才会退出,进程里默认的线程我们叫做主线程或者叫做UI线 ...

  9. JAVA基础知识之多线程——线程通信

    传统的线程通信 Object提供了三个方法wait(), notify(), notifyAll()在线程之间进行通信,以此来解决线程间执行顺序等问题. wait():释放当前线程的同步监视控制器,并 ...

随机推荐

  1. Redis学习篇(五)之Set类型及其操作

    SADD 作用:向集合中添加元素 语法:SADD key menber [, ...] 添加重复的元素会返回0,失败 SMEMBERS 作用:返回指定集合中的元素 语法: SMEMBERS key S ...

  2. EventBus机制 handler 区别

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 事件巴士 是 采用 观察者模式 实现 事件订阅总线, 可以用在 应用程序中, 组件之间, ...

  3. [CCC 2018] 平衡树

    题面在这里! 根据题目描述就可以直接模拟出一个暴力. 如果把前 n^(1/2) 的树的方案数先一遍 O(n^(3/4)) 暴力预处理出来(其实复杂度并到不了这个级别),然后把n带进来直接暴力算就行了. ...

  4. bzoj 1007 半交平面简化版

    本题就是求半交平面的交包含哪些直线,而且有点特殊(一般的半交平面用双端队列,因为可能转到最开始的直线,但本题不会,所以只需要一端操作就行了). /*************************** ...

  5. uoj117 欧拉回路

    题目描述: 有一天一位灵魂画师画了一张图,现在要你找出欧拉回路,即在图中找一个环使得每条边都在环上出现恰好一次. 一共两个子任务: 这张图是无向图.(50 分) 这张图是有向图.(50 分) 输入格式 ...

  6. 【原创】Eclipse中Android项目引用

    1.选择名为SMSSDK的项目,右键--->Properties--->Android--->将Is Library勾上--->OK. 2.选中另一个名为FragmentDem ...

  7. VK Cup 2016 - Qualification Round 1 (Russian-Speaking Only, for VK Cup teams) A. Voting for Photos 水题

    A. Voting for Photos 题目连接: http://www.codeforces.com/contest/637/problem/A Description After celebra ...

  8. codevs 1060 搞笑运动会 dp

    1060 搞笑世界杯 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://codevs.cn/problem/1060/ Description ...

  9. Linux下路由表调试工具traceroute

    在做静态路由表或者路由表分配时,比较直接的调试工具是traceroute,可以跟踪访问一个IP所到达的路由层级,从而知道经过哪些链路. 参考: http://man.linuxde.net/trace ...

  10. InvalidateRect()与Invalidate()的用法(转)

    BOOL InvalidateRect(   HWND hWnd,           // 窗口句柄   CONST RECT* lpRect,   // 矩形区域   BOOL bErase    ...