您的位置:首页 > 职场人生

《黑马程序员》 并发库中的CountDownLatch的小示例

2014-04-02 09:54 267 查看
------- android培训java培训、期待与您交流! ----------
public class CountDownLatch {
/**
* CountDownLatch
*它有一个初始值。调用它内部的方法countDown可以把它的值给-1
这样。当它的值到达0之后接着干下一件事情:
可以1人通知多人
也可以多人通知1人
A   B   C(运动员等待指令)
---------------------------------------
10--9--8--7--6--5--4--3--2--1--0   (指令员下令)
||
start
A   B   C (冲啊)
|   |   |
|   |   |
V   V   V
10--9--8--7--6--5--4--3--2--1--0  (CA-1)
10--9--8--7--6--5--4--3--2--1--0  (CB-1)
10--9--8--7--6--5--4--3--2--1--0  (CB-1)
|   |   |
|   |   |
V   V   V
---------------------------------------
指令员根据时间来进行裁判
*/
public static void main(String[] args) {
//我们来做一个比赛的活动
ExecutorService pool=Executors.newCachedThreadPool();
//指令员所使用的计数器
final java.util.concurrent.CountDownLatch cd1=new java.util.concurrent.CountDownLatch(1);
//运动员所使用计数器。它在到达目的地的第一时间把计数器置为0。指令员通过这个时间来裁判他们的成绩
final java.util.concurrent.CountDownLatch cd2=new java.util.concurrent.CountDownLatch(3);
//往线程池添加三个任务
for(int i=0;i<3;i++){
Runnable run=new Runnable() {
@Override
public void run() {
try{
//获取线程编号
String threadMsg=Thread.currentThread().getName();
//pool-1-thread-1  从最后一个-开始截取
String athletes="运动员"	+threadMsg.substring(threadMsg.lastIndexOf('-')+1);
System.out.println(athletes
+ "准备就绪,正在等待出发命令");
cd1.await(); // 让第一个计数器处于等待状态
System.out.println(athletes
+ "已接受到指令,出发....");
Thread.sleep((long) (Math.random() * 10000));
System.out.println(athletes
+ "到达终点,准备返回数据");
cd2.countDown(); // 计数器-1 ,每个线程都-1,三个全线全部-1即三个线程任务执行完毕之后结果就是0了
}catch(Exception e){
e.printStackTrace();
}
}
};
pool.execute(run);
}

try{
Thread.sleep((long)(Math.random()*10000));
System.out.println("指令员准备下达命令,准备进入比赛倒计时");
cd1.countDown();  //把时间计数器-1
System.out.println("指令员已下达开始指令");
cd2.await(); //让第二个计数器处于等待,收到结果之后才开始下一步的操作
System.out.println("指令员已经收到所有参赛人员的返回结果,准备根据结果裁判");
}catch(Exception e){
e.printStackTrace();
}
}
}

/**
* 运动员1准备就绪,正在等待出发命令
运动员2准备就绪,正在等待出发命令
运动员3准备就绪,正在等待出发命令
指令员准备下达命令,准备进入比赛倒计时
指令员已下达开始指令
运动员1已接受到指令,出发....
运动员2已接受到指令,出发....
运动员3已接受到指令,出发....
运动员2到达终点,准备返回数据
运动员3到达终点,准备返回数据
运动员1到达终点,准备返回数据
指令员已经收到所有参赛人员的返回结果,准备根据结果裁判
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息