package concurrent;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* <pre>
* @author: bing
* @date: 2014年9月3日 下午1:06:48
* @company: ---
* @version: 1.0
* @Mail:
*
* countdown:倒计时 latch:[lætʃ] 门闩、弹簧锁
* </pre>
*
* 百米赛跑:教练发令枪打响,运动员开始比赛,全部跑完以后教练公布成绩。
*/
public class P_CountdownLatchTest {
public static void main(String[] args) {
ExecutorService service = Executors.newCachedThreadPool();
final CountDownLatch cdOrder = new CountDownLatch(1);// 一个人可以把所有人唤醒
final CountDownLatch cdAnswer = new CountDownLatch(3);// 必须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 (Exception 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();
}
}
Java 并发编程之 CountDownLatch
最新推荐文章于 2025-05-14 15:15:36 发布