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

例子:

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

 class Driver {
void main() throws InterruptedException {
CountDownLatch startSignal = new CountDownLatch(1); // 使线程同时开始
CountDownLatch doneSignal = new CountDownLatch(10); // 全部结束 // create and start threads
for (int i = 0; i < 10; ++i) {
new Thread(new Worker(startSignal, doneSignal)).start();
} // let all threads proceed
startSignal.countDown(); // wait for all to finish
doneSignal.await();
}
} class Worker implements Runnable {
private final CountDownLatch startSignal;
private final CountDownLatch doneSignal; Worker(CountDownLatch startSignal, CountDownLatch doneSignal) {
this.startSignal = startSignal;
this.doneSignal = doneSignal;
} public void run() {
try {
//wait the start signal
startSignal.await();
doWork();
doneSignal.countDown();
} catch (InterruptedException ex) {
}
} void doWork() {
}
}

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

实现:

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

private static final class Sync extends AbstractQueuedSynchronizer {
private static final long serialVersionUID = 4982264981922014374L; Sync(int count) {
setState(count);
} int getCount() {
return getState();
} protected int tryAcquireShared(int acquires) {
return (getState() == 0) ? 1 : -1;
} protected boolean tryReleaseShared(int releases) {
// Decrement count; signal when transition to zero
for (;;) {
int c = getState();
if (c == 0)
return false;
int nextc = c-1;
if (compareAndSetState(c, nextc))
return nextc == 0;
}
}
}

end


最新文章

  1. 空MVC项目找不到System.Web.Optimization的处理办法
  2. RedHat Enterprise Linux 7关闭防火墙方法
  3. 没人告诉你关于z-index的一些事
  4. 从Spring容器中获取Bean。ApplicationContextAware
  5. 数据库 —— Access 数据库
  6. 关于PHP高并发抢购系统设计
  7. Win10下C:\Users\John以账户名称命名的系统文件夹用户名的修改
  8. js禁止开发者工具
  9. Java开发笔记(八十二)注解的基本单元——元注解
  10. xterm配置
  11. 16. 3Sum Closest (JAVA)
  12. How to enable mp3 on Ubuntu
  13. ArcGIS for qml -添加自由文本
  14. SpringBoot mybatis配置
  15. 小米手机安装mitmproxy证书
  16. Android7.0 Doze模式分析(一)Doze介绍 &amp;amp; DeviceIdleController
  17. jconsole连接远程Tomcat应用
  18. Kafka 接受数据并消费到hbase数据库
  19. python 面向对象(进阶篇)转载武沛齐
  20. 挖一挖unsigned int和补码

热门文章

  1. HDU 3466 Proud Merchants 排序 背包
  2. js 元素高度宽度整理
  3. linux上不能显示Jfreechart的图片文件
  4. navigationBar
  5. YII2笔记之一
  6. Java -- JDBC 获取数据库自动 生成的主键值
  7. intellij idea build时出现Artifact contains illegal characters的解决
  8. js中介者模式
  9. jQuery ajax 标准写法及进度条绘制
  10. review10