CountDownLatch是线程同步辅助类,它允许一个或多个线程wait直到countdown被调用使count为0。

CountDownLatch是在java1.5被引入,存在于java.util.concurrent包下。

常用于

1:用于在一个线程中等待N个线程完成

2:让N个子线程同时开始run

方法:

CountDownLatch(int count)   构造器,初始化次数

void await() throws InterruptedException  使一个线程wait,直到count为0

boolean await(long timeout, TimeUnit unit)   使一个线程wait,直到count为0或等待时间timeout

void countDown()   count减一

long getCount()     返回当前count

String toString()    返回当前对象及当前count

例子:

-----------------

  1. class Driver {
  2. void main() throws InterruptedException {
  3. CountDownLatch startSignal = new CountDownLatch(1); // 使线程同时开始
  4. CountDownLatch doneSignal = new CountDownLatch(10); // 全部结束
  5.  
  6. // create and start threads
  7. for (int i = 0; i < 10; ++i) {
  8. new Thread(new Worker(startSignal, doneSignal)).start();
  9. }
  10.  
  11. // let all threads proceed
  12. startSignal.countDown();
  13.  
  14. // wait for all to finish
  15. doneSignal.await();
  16. }
  17. }
  18.  
  19. class Worker implements Runnable {
  20. private final CountDownLatch startSignal;
  21. private final CountDownLatch doneSignal;
  22.  
  23. Worker(CountDownLatch startSignal, CountDownLatch doneSignal) {
  24. this.startSignal = startSignal;
  25. this.doneSignal = doneSignal;
  26. }
  27.  
  28. public void run() {
  29. try {
  30. //wait the start signal
  31. startSignal.await();
  32. doWork();
  33. doneSignal.countDown();
  34. } catch (InterruptedException ex) {
  35. }
  36. }
  37.  
  38. void doWork() {
  39. }
  40. }

-----------------

实现:

AQS静态内部类实现的同步控制

  1. private static final class Sync extends AbstractQueuedSynchronizer {
  2. private static final long serialVersionUID = 4982264981922014374L;
  3.  
  4. Sync(int count) {
  5. setState(count);
  6. }
  7.  
  8. int getCount() {
  9. return getState();
  10. }
  11.  
  12. protected int tryAcquireShared(int acquires) {
  13. return (getState() == 0) ? 1 : -1;
  14. }
  15.  
  16. protected boolean tryReleaseShared(int releases) {
  17. // Decrement count; signal when transition to zero
  18. for (;;) {
  19. int c = getState();
  20. if (c == 0)
  21. return false;
  22. int nextc = c-1;
  23. if (compareAndSetState(c, nextc))
  24. return nextc == 0;
  25. }
  26. }
  27. }

end


Java基础--CountDownLatch的更多相关文章

  1. Java基础教程:多线程基础(5)——倒计时器(CountDownLatch)

    Java基础教程:多线程基础(5)——倒计时器(CountDownLatch) 引入倒计时器 在多线程协作完成业务功能时,有时候需要等待其他多个线程完成任务之后,主线程才能继续往下执行业务功能,在这种 ...

  2. [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)

    如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html   谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...

  3. java基础-java核心知识库

    本人从事java开发6年左右,主要从事互联网相关的开发,目前还是奋战在一线的码农,痛并快乐着.受互联网产品热潮的影响,关注高性能低成本架构,互联网开发框架,以下是我认为作为一个资深java程序员应该掌 ...

  4. 转载:[Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)

    原文:http://www.cnblogs.com/wang-meng/p/5898837.html 一:继承.抽象类与接口区别.访问控制(private, public, protected,默认) ...

  5. Java 基础系列合集

    Java基础知识你知道多少? Java特性 Java三大特性:封装,继承,多态 Java 抽象类与接口 Java 浅拷贝和深拷贝 Java static和final Java 内部类.静态内部类.匿名 ...

  6. 精心收集java基础106条

    Java基础 1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 一个Java源文件中可以定义多个类,但最多只能定义一个public的类,并且public ...

  7. Java基础】并发 - 多线程

    Java基础]并发 - 多线程 分类: Java2014-05-03 23:56 275人阅读 评论(0) 收藏 举报 Java   目录(?)[+]   介绍 Java多线程 多线程任务执行 大多数 ...

  8. java基础(反射,注解,多线程,juc)

    JAVA基础 java反射 class对象 三种方式获取class加载时对象 1.class.forName("全类名"):将字节码文件加载进内存,返回class对象 2.类名.c ...

  9. Java基础?看完以后再也不惧怕面试了

    前言 这篇文章主要是Java基础部分,主要分为3个部分:Java集合.Java多线.JVM:这些东西帮助我面试成功率提升了很多.后面还有中间件Spring.Redis.RocketMQ等等吧,祝愿大家 ...

随机推荐

  1. 20145240 《Java程序设计》第十周学习总结

    20145240 <Java程序设计>第十周学习总结 教材学习内容总结 网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据. 程序员所作的事情就是把数据发送到指定的位置 ...

  2. 如何判断Linux服务器是否被入侵?

    被入侵服务器的症状 当服务器被没有经验攻击者或者自动攻击程序入侵了的话,他们往往会消耗 100% 的资源.他们可能消耗 CPU 资源来进行数字货币的采矿或者发送垃圾邮件,也可能消耗带宽来发动 DoS ...

  3. 使用shell自动备份数据库

    全备份 #!/bin/sh #mysql地址 #检测用户是否手动输入了密码 mysql_host="" #mysql用户 mysql_user="" #mysq ...

  4. SpringMVC传递参数和获取参数以及返回数据

    1.传递form表单,参数接收到对象,name和对象属性对应上即可:   2.springmvc不能直接通过form表单传递多个对象的list集合,要么采用ajax传递,要么采用封装了list属性的b ...

  5. How to use Jenkins

    一.关键点 1.how to start the build server? do i need to start some app to do this? I don't believe so... ...

  6. 利用RandomAccessFile类在指定文件指定位置插入内容

    package File; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; ...

  7. vijos 1057 盖房子 dp 最大子正方形

    P1057盖房子 未递交 标签:[显示标签] 描述 永恒の灵魂最近得到了面积为n*m的一大块土地(高兴ING^_^),他想在这块土地上建造一所房子,这个房子必须是正方形的. 但是,这块土地并非十全十美 ...

  8. svg_鼠标手型

    1. 貌似是 属性 "cursor :pointer;",待测试. 2.

  9. 离线unity API文档

    只要安装的时候勾选上document 打开unity选择help-ScriptReference就可以打开本地API了.

  10. 解决CentOS 6环境时区、日期、时间同步方法

    有些时候我们在选择的VPS服务商提供的VPS主机方案安装系统.安装建站环境之后就直接上马网站,但是我们会有发现发布的文章或者有些时候设置的自动执行脚本时间与我们实际的时间不符合.甚至有些程序是需要与本 ...