Java5 多线程(六)--CountDownLatch 同步工具类
详细代码如下:
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();//直到cdOrder的计数器归0,才能往下执行
//如果把这个程序比喻成一个3个运动员在比赛,还有一个裁判
//cdOrder的计数器归0,表明裁判名枪了,运动员可以跑了.
System.out.println("线程"
+ Thread.currentThread().getName() + "已接受命令");
Thread.sleep((long) (Math.random() * 10000));
System.out.println("线程"
+ Thread.currentThread().getName()
+ "回应命令处理结果");
cdAnswer.countDown();//每一个运动员到此计数器就减一,
} catch (Exception e) {
e.printStackTrace();
}
}
};
service.execute(runnable);
}
try {
Thread.sleep((long) (Math.random() * 10000));
System.out.println("线程" + Thread.currentThread().getName()
+ "即将发布命令");
cdOrder.countDown();//cdOrder的计数器减1,
System.out.println("线程" + Thread.currentThread().getName()
+ "已发送命令,正在等待结果");
cdAnswer.await();//cdAnswer直到计数器为0,也就是上面三个线程执行完毕,
//裁判就可以公布成绩了
System.out.println("线程" + Thread.currentThread().getName()
+ "已收到所有响应结果");
} catch (Exception e) {
e.printStackTrace();
}
service.shutdown();
}
}执行结果如下:
转载请注明出处 :http://blog.****.net/johnny901114/article/details/8695726