CountDownLatch的作用是能使用多个线程进来之后,且线程任务执行完毕之后,才执行,

  闭锁(Latch):一种同步方法,可以延迟线程的进度直到线程到达某个终点状态。通俗的讲就是,一个闭锁相当于一扇大门,在大门打开之前所有线程都被阻断,一旦大门打开所有线程都将通过,但是一旦大门打开,所有线程都通过了,那么这个闭锁的状态就失效了,门的状态也就不能变了,只能是打开状态。也就是说闭锁的状态是一次性的,它确保在闭锁打开之前所有特定的活动都需要在闭锁打开之后才能完成。

  与CountDownLatch第一次交互是主线程等待其它的线程,主线程必须在启动其它线程后立即调用await方法,这样主线程的操作就会在这个方法上阻塞,直到其他线程完成各自的任务。

  其他的N个线程必须引用闭锁对象,因为他们需要通知CountDownLatch对象,他们已经完成了各自的任务,这种机制就是通过countDown()方法来完成的。每调用一次这个方法,在构造函数中初始化的count值就减1,所以当N个线程都调用了这个方法count的值等于0,然后主线程就能通过await方法,恢复自己的任务。

  这里的主线程是相对的概念,需要根据CountDownLatch创建的场景分析。

  1. package com.cxy.cyclicBarrier;
  2.  
  3. import java.util.Random;
  4. import java.util.concurrent.CountDownLatch;
  5. import java.util.concurrent.locks.Lock;
  6. import java.util.concurrent.locks.ReentrantLock;
  7.  
  8. /**
  9. * Created by Administrator on 2017/4/10.
  10. */
  11. public class CountDownDemo {
  12.  
  13. private static final Random random = new Random();
  14. // 用于判断发令之前运是否已经进入准备状态,需要等待10个准备就绪,占有锁,等待10个完成,释放锁。
  15. private static CountDownLatch readyLatch = new CountDownLatch();
  16. // 用于判断裁判是否已经发令,占有锁,等待裁判发令完成,释放锁
  17. private static CountDownLatch startLatch = new CountDownLatch();
  18.  
  19. public static void main(String[] args) {
  20.  
  21. // 用于判断发令之前是否已经进入准备状态,需要等待10个准备就绪,占有锁,等待10个完成,释放锁。
  22. // CountDownLatch readyLatch = new CountDownLatch(SPORTSMAN_COUNT);
  23. // 用于判断是否已经发令,占有锁,等待裁判发令完成,释放锁
  24. // CountDownLatch startLatch = new CountDownLatch(1);
  25.  
  26. // 启动10个线程,也就是10个,做准备工作
  27. for (int i = ; i < ; i++) {
  28. Thread t = new Thread(new MyTask((i + ) + "号", readyLatch, startLatch));
  29. t.start();
  30. }
  31. // 当前在其他准备就绪前一直等待,也就是说等readyLatch倒数计数器为0之前一直等待
  32. try {
  33. readyLatch.await();
  34. } catch (InterruptedException e) {
  35. e.printStackTrace();
  36. }
  37.  
  38. // 裁判发令,释放锁
  39. startLatch.countDown();
  40.  
  41. System.out.println("老大:所有准备完毕,开始...");
  42.  
  43. }
  44.  
  45. static class MyTask implements Runnable {
  46.  
  47. private Lock lock = new ReentrantLock();
  48.  
  49. private CountDownLatch ready;
  50. private CountDownLatch start;
  51. private String name;
  52.  
  53. public MyTask(String name, CountDownLatch ready, CountDownLatch start) {
  54. this.ready = ready;
  55. this.start = start;
  56. this.name = name;
  57. }
  58.  
  59. @Override
  60. public void run() {
  61. lock.lock();
  62. try {
  63.  
  64. // 1. 准备就绪的逻辑,准备readyTime秒
  65. int readyTime = random.nextInt();
  66. System.out.println(name + ":我需要" + readyTime + "秒的时间准备。");
  67. try {
  68. Thread.sleep(readyTime);
  69. } catch (InterruptedException e) {
  70. e.printStackTrace();
  71. }
  72. System.out.println(name + "我已经准备完毕!");
  73. // 释放锁readyLatch-1,表示一个已经就绪
  74. ready.countDown();
  75. try {
  76. // 等待发开始命令
  77. start.await();
  78. } catch (InterruptedException e) {
  79. e.printStackTrace();
  80. }
  81. System.out.println(name + ":行动...");
  82. } catch (Exception e) {
  83. // TODO: handle exception
  84. } finally {
  85. lock.unlock();
  86. }
  87.  
  88. }
  89.  
  90. }
  91. }

执行结果:

  1. 1号:我需要365秒的时间准备。
  2. 2号:我需要454秒的时间准备。
  3. 5号:我需要938秒的时间准备。
  4. 3号:我需要967秒的时间准备。
  5. 7号:我需要878秒的时间准备。
  6. 6号:我需要540秒的时间准备。
  7. 9号:我需要552秒的时间准备。
  8. 10号:我需要281秒的时间准备。
  9. 4号:我需要951秒的时间准备。
  10. 8号:我需要696秒的时间准备。
  11. 10号我已经准备完毕!
  12. 1号我已经准备完毕!
  13. 2号我已经准备完毕!
  14. 6号我已经准备完毕!
  15. 9号我已经准备完毕!
  16. 8号我已经准备完毕!
  17. 7号我已经准备完毕!
  18. 5号我已经准备完毕!
  19. 4号我已经准备完毕!
  20. 3号我已经准备完毕!
  21. 老大:所有准备完毕,开始...
  22. 2号:行动...
  23. 6号:行动...
  24. 1号:行动...
  25. 9号:行动...
  26. 8号:行动...
  27. 7号:行动...
  28. 10号:行动...
  29. 5号:行动...
  30. 4号:行动...
  31. 3号:行动...
  32.  
  33. Process finished with exit code

countdownLatch也是也实现cycliBarrier珊拦结构,不过需要使用lock锁

JUC包下CountDownLatch学习笔记的更多相关文章

  1. JUC包下CyclicBarrier学习笔记

    CyclicBarrier,一个同步辅助类,在API中是这么介绍的: 它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).在涉及一组固定大小的线程的程序中,这 ...

  2. JUC包下Semaphore学习笔记

    在Java的并发包中,Semaphore类表示信号量.Semaphore内部主要通过AQS(AbstractQueuedSynchronizer)实现线程的管理.Semaphore有两个构造函数,参数 ...

  3. Linux下iptables学习笔记

    Linux下iptables学习笔记 在Centos7版本之后,防火墙应用已经由从前的iptables转变为firewall这款应用了.但是,当今绝大多数的Linux版本(特别是企业中)还是使用的6. ...

  4. YOLO---Darknet下的学习笔记 V190319

    YOLO---Darknet下的学习笔记 @WP 20190319 很久没有用YOlO算法了,今天又拿过来玩玩.折腾半天,才好运行通的,随手记一下: 一是,终端下的使用.二是,python接口的使用. ...

  5. YOLO---Darknet下的学习笔记

    YOLO.V3-Darknet下的学习笔记 @wp20180927 [目录] 一. 安装Darknet(仅CPU下) 2 1.1在CPU下安装Darknet方式 2 1.2在GPU下安装Darknet ...

  6. JUC.Lock(锁机制)学习笔记[附详细源码解析]

    锁机制学习笔记 目录: CAS的意义 锁的一些基本原理 ReentrantLock的相关代码结构 两个重要的状态 I.AQS的state(int类型,32位) II.Node的waitStatus 获 ...

  7. 20135202闫佳歆--week5 系统调用(下)--学习笔记

    此为个人笔记存档 week 5 系统调用(下) 一.给MenuOS增加time和time-asm命令 这里老师示范的时候是已经做好的了: rm menu -rf 强制删除 git clone http ...

  8. juc包:使用 juc 包下的显式 Lock 实现线程间通信

    一.前置知识 线程间通信三要素: 多线程+判断+操作+通知+资源类. 上面的五个要素,其他三个要素就是普通的多线程程序问题,那么通信就需要线程间的互相通知,往往伴随着何时通信的判断逻辑. 在 java ...

  9. 【Java多线程】JUC包下的工具类CountDownLatch、CyclicBarrier和Semaphore

    前言 JUC中为了满足在并发编程中不同的需求,提供了几个工具类供我们使用,分别是CountDownLatch.CyclicBarrier和Semaphore,其原理都是使用了AQS来实现,下面分别进行 ...

随机推荐

  1. mysql存储引擎简介

  2. 【转】在SharePoint Server 2010中更改“我的网站”

    在安装SharePoint Server 2010的时候,创建的第一个站点是一个"NetBIOS名称"的网站,而这个时候,"我的网站"(或称"个人网站 ...

  3. Python PyPI中国镜像

    from:http://blog.makto.me/post/2012-11-01/pypi-mirror from:http://www.pypi-mirrors.org/ from:http:// ...

  4. cout/cin

    转载来源:http://baike.baidu.com/link?url=NiNaSw0pF7RqFO8u0jx8KWk9yOfFFYy24xCJlQ6_qMcw5_WBzRKOqsO6tfvvJbZ ...

  5. tensorflow 中 feed的用法

    Feed 上述示例在计算图中引入了 tensor, 以常量或变量的形式存储. TensorFlow 还提供了 feed 机制, 该机制 可以临时替代图中的任意操作中的 tensor 可以对图中任何操作 ...

  6. 618F Double Knapsack

    传送门 题目大意 分析 代码 #include<iostream> #include<cstdio> #include<cstring> #include<s ...

  7. p5156 [USACO18DEC]Sort It Out

    传送门 分析 我们发现对于没有发现的点相对位置不会发生改变 于是我们可以吧问题转化为求一个lis 于是我们字典序第k小的答案就是字典序第k大的lis 代码 #include<iostream&g ...

  8. 498B Name That Tune

    传送门 题目大意 n首音乐,第i首被听出来的概率为pi,刚开始听第一首,1s后如果听出来了则放第下一首,否则接着听这一首,第i首在连续听了ti s之后一定会被听出来,问Ts后听出来的歌的期望数量. 分 ...

  9. Luogu 3698 [CQOI2017]小Q的棋盘

    BZOJ 4813 虽然数据范围很迷人,但是想树形$dp$没有前途. 先发现一个事情,就是我们可以先选择一条链,最后要走到这一条链上不回来,走到链上的点每一个只需要一步,而如果要走这条链之外的点,一个 ...

  10. 手机APP兼容性测试

    兼容性测试方案 兼容性问题 屏幕分辨率兼容性问题 软件(iOS和Android系统版本及不同厂家的定制ROM)兼容性问题 硬件(不同的CPU.内存大小等等)兼容性问题 网络(2G/3G/4G/WIFI ...