您的位置:首页 > 编程语言 > Java开发

【Java多线程与并发库】14.java5的CountDownLatch同步工具

2016-11-02 09:06 806 查看
CountDownLatch

犹如倒计时计数器,调用CountDownLatch对象的countDown方法就将计数器减1,当计数器到达0时,

则所有等待着或单个等待着开始执行。

可以实现一个人(也可以是多个人)等待其它所有人来通知他,也可以实现一个人通知多个人的

效果,类似裁判一声口令,运动员同时开始奔跑,或者所有运动员都跑到终点后裁判才可以公

布结果,这个功能适合做类似百米赛跑的功能。

实例:
package cn.edu.hpu.test;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CountdownLatchTest {
public static void main(String[] args) {
ExecutorService service= Executors.newCachedThreadPool();
final CountDownLatch cdOrder=new CountDownLatch(1);
final CountDownLatch cdAnswer=new CountDownLatch(3);
for (int i = 0; i < 3; i++) {
//创建三个一样的线程任务
Runnable runnable=new Runnable(){

public void run() {
try {
System.out.println("线程:"+Thread.currentThread().getName()+
"正准备接受命令");

cdOrder.await();
System.out.println("线程:"+Thread.currentThread().getName()+
"已接受命令");
Thread.sleep((long)(Math.random()*10000));
System.out.println("线程:"+Thread.currentThread().getName()+
"回应命令处理结果");

cdAnswer.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}

};
service.execute(runnable);
}
try {
Thread.sleep((long)(Math.random()*10000));
System.out.println("线程:"+Thread.currentThread().getName()+
"即将发布命令");
cdOrder.countDown();
System.out.println("线程:"+Thread.currentThread().getName()+
"已发送命令,正在等待结果...");
cdAnswer.await();
System.out.println("线程:"+Thread.currentThread().getName()+
"已收到所有响应结果");
} catch (Exception e) {
e.printStackTrace();
}
service.shutdown();
}
}
首先利用Executors创建了一个缓存线程池(大小自适应),然后创建一个命令计数器和一个

答案计数器,基础计数分别是1和3。countDown()方法使计数器的计数减一,所以一开始如

果主线程不执行countDown()方法的话,所有子线程都在等待,直到主线程执行countDown()

方法,然后主线程就在等待各个子线程的答案,3个子线程,每一个执行完任务之后都会把

cdAnswer的计数减一,直到三个线程都完成任务(都减一)的时候,cdAnswer计数才结束,

这时候主线程才可以继续执行。

结果:



转载请注明出处:http://blog.csdn.net/acmman/article/details/53004472
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐