CountDownLatch类

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

  CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成了任务,然后在CountDownLatch上等待的线程就可以恢复执行任务。

构造方法:

  CountDownLatch(int count)

构造一个以给定计数 CountDownLatch CountDownLatch。

方法:

  • await() 导致当前线程等到锁存器计数到零,除非线程是 interrupted 。
  • await(long timeout, TimeUnit unit) 使当前线程等待直到锁存器计数到零为止,除非线程为 interrupted或指定的等待时间过去。
  • countDown() 减少锁存器的计数,如果计数达到零,释放所有等待的线程。
  • getCount() 返回当前计数。
模拟运动员赛跑DEMO
 import concurrenttest.countdownlatch.thread.Thread_1;

 import java.util.concurrent.CountDownLatch;

 /**
* 描述:模拟运动员赛跑DEMO
*
* @author bc
* @create 2018-09-28 10:49
*/
public class RunTest_1 { public static void main(String[] args) {
try {
CountDownLatch comingTag = new CountDownLatch(10);//裁判等待运动员到来
CountDownLatch waitTag = new CountDownLatch(1);//等待裁判说准备开始
CountDownLatch waitRunTag = new CountDownLatch(10);//等待起跑
CountDownLatch beginTag = new CountDownLatch(1);//起跑
CountDownLatch endTag = new CountDownLatch(10);//到达终点 Thread_1[] arr = new Thread_1[10];
for (int i = 0; i < arr.length; i++) {
arr[i] = new Thread_1(comingTag, waitTag, waitRunTag, beginTag, endTag);
arr[i].start();
} System.out.println("裁判等待运动员到来");
comingTag.await();
System.out.println("裁判看到所有运动员都来了,巡视一下");
Thread.sleep(5000);
waitTag.countDown();
System.out.println("各就各位!");
waitRunTag.await();
Thread.sleep(2000);
System.out.println("发令枪响!");
beginTag.countDown();
endTag.await();
System.out.println("所有运动员到了,统计结果");
} catch (InterruptedException e) {
e.printStackTrace();
} }
}

RunTest_1

 import java.util.concurrent.CountDownLatch;

 /**
* 描述: 模拟运动员赛跑
*
* @author bc
* @create 2018-09-28 10:10
*/
public class Thread_1 extends Thread { private CountDownLatch comingTag;//裁判等待运动员到来
private CountDownLatch waitTag;//等待裁判说准备开始
private CountDownLatch waitRunTag;//等待起跑
private CountDownLatch beginTag;//起跑
private CountDownLatch endTag;//到达终点 public Thread_1(CountDownLatch comingTag, CountDownLatch waitTag, CountDownLatch waitRunTag,
CountDownLatch beginTag, CountDownLatch endTag) {
super();
this.comingTag = comingTag;
this.waitTag = waitTag;
this.waitRunTag = waitRunTag;
this.beginTag = beginTag;
this.endTag = endTag;
} @Override
public void run() {
try {
System.out.println("运动员正飞奔而来");
Thread.sleep((int)(Math.random()*10000));
System.out.println(Thread.currentThread().getName()+"到起跑点了");
comingTag.countDown();
System.out.println("等待裁判说准备");
waitTag.await();
System.out.println("各就各位!准备起跑的姿势");
Thread.sleep((int)(Math.random()*10000));
waitRunTag.countDown();
beginTag.await();
System.out.println(Thread.currentThread().getName()+"疯狂奔跑中");
Thread.sleep((int)(Math.random()*10000));
endTag.countDown();
System.out.println(Thread.currentThread().getName()+"到达终点");
} catch (InterruptedException e) {
e.printStackTrace();
} }
}

Thread_1

CountDownLatch的不足
CountDownLatch是一次性的,计数器的值只能在构造方法中初始化一次,之后没有任何机制再次对其设置值,当CountDownLatch使用完毕后,它不能再次被使用。

详见本人github:https://github.com/BrokenColor/java-demo 下的 countdownlatch-包中的测试

java并发编程之二--CountDownLatch的使用的更多相关文章

  1. [Java并发编程(二)] 线程池 FixedThreadPool、CachedThreadPool、ForkJoinPool?为后台任务选择合适的 Java executors

    [Java并发编程(二)] 线程池 FixedThreadPool.CachedThreadPool.ForkJoinPool?为后台任务选择合适的 Java executors ... 摘要 Jav ...

  2. Java并发编程工具类 CountDownLatch CyclicBarrier Semaphore使用Demo

    Java并发编程工具类 CountDownLatch CyclicBarrier Semaphore使用Demo CountDownLatch countDownLatch这个类使一个线程等待其他线程 ...

  3. Java并发编程(二)如何保证线程同时/交替执行

    第一篇文章中,我用如何保证线程顺序执行的例子作为Java并发系列的开胃菜.本篇我们依然不会有源码分析,而是用另外两个多线程的例子来引出Java.util.concurrent中的几个并发工具的用法. ...

  4. Java 并发编程中的 CountDownLatch 锁用于多个线程同时开始运行或主线程等待子线程结束

    Java 5 开始引入的 Concurrent 并发软件包里面的 CountDownLatch 其实可以把它看作一个计数器,只不过这个计数器的操作是原子操作,同时只能有一个线程去操作这个计数器,也就是 ...

  5. Java 并发编程(二)对象的不变性和安全的公布对象

    一.不变性 满足同步需求的还有一种方法是使用不可变对象(Immutable Object). 到眼下为止,我们介绍了很多与原子性和可见性相关的问题,比如得到失效数据.丢失更新操作或光查到某个对象处于不 ...

  6. Java并发编程(二)

    1.Lock接口                                                        在Lock接口出现之前,Java程序是靠synchronized关键字实 ...

  7. Java并发编程之闭锁CountDownLatch简单介绍

    闭锁相当于一扇门,在闭锁到达结束状态之前,这扇门一直是关闭着的,没有不论什么线程能够通过,当到达结束状态时.这扇门才会打开并容许全部线程通过.它能够使一个或多个线程等待一组事件发生. 闭锁状态包含一个 ...

  8. Java并发编程笔记之 CountDownLatch闭锁的源码分析

    JUC 中倒数计数器 CountDownLatch 的使用与原理分析,当需要等待多个线程执行完毕后在做一件事情时候 CountDownLatch 是比调用线程的 join 方法更好的选择,CountD ...

  9. Java并发编程(二)创建线程的三种方法

    进程与线程 1.  进程 进程和代码之间的关系就像音乐和乐谱之间的关系一样,演奏结束的时候音乐就不存在了但乐谱还在:程序执行结束的时候进程就消失了但代码还在,而计算机就是代码的演奏家. 2. 线程 线 ...

随机推荐

  1. python3 requests 进行接口测试、爬虫使用总结

    Requests 是第三方模块,如果要使用的话需要导入.Requests也可以说是urllib模块的升级版,使用上更方便. 这是使用urllib的例子. import urllib.request i ...

  2. 使用Github发布自己的网站

    1.编写好自己的index.html 2.在github上新建一个分支,分支名需要按xxx.github.com(xxx为github账号名): 3.进入分支的setting界面,自动生成网页,会在分 ...

  3. 画柱状图Java

    样例输入:THE QUICK BROWN FOX JUMPED OVER THE LAZY DOG.THIS IS AN EXAMPLE TO TEST FOR YOURHISTOGRAM PROGR ...

  4. net.tcp协议的wcf服务在远程计算机无法调用问题分析

    可能原因1:net.tcp监听端口服务没有启动. 可能原因2:防火墙阻止了端口服务器路径访问. 可能原因3:配置文件路径endpoint路径和引用路径不一致 可能原因4:权限受限制.

  5. ruby on rails validates

    validates :conclusion, :presence => true, :inclusion => { :in => [0,1] } validates :email, ...

  6. java提升路线

    转载自:http://blog.csdn.net/a151296/article/details/43658853 作为一名即将从事java开发的应届毕业生,迷茫中,转载此篇文章,作为提升自己的学习方 ...

  7. Broken pipe错误原因

      这个异常是由于以下几个原因造成. 1.客户端再发起请求后没有等服务器端相应完,点击了stop按钮,导致服务器端接收到取消请求.  通常情况下是不会有这么无聊的用户,出现这种情况可能是由于用户提交了 ...

  8. web上的复制

    你可能曾经尝试过复制网页上的一些文字,得到的却是令人沮丧的的结果.这篇文章介绍相关的内容. 不是真正的文字 这可能是最常见的问题,很多人尝试对一张带有文字的图片进行像文字那样的选择,复制当然不行了. ...

  9. JS中的slice和splice

    1,slice  : 定义:接收一个或两个参数,它可以创建一个由当前数组中的一项或多项组成的新数组,注意是新数组哦~ 也就是说它不会修改原来数组的值. 用法:slice( para1 ),会截取从pa ...

  10. 框架-spring源码分析(一)

    框架-spring源码分析(一) 参考: https://www.cnblogs.com/heavenyes/p/3933642.html http://www.cnblogs.com/BINGJJF ...