使用CountDownLatch计数器模拟赛跑比赛
import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
*模拟赛跑比赛
*要求:
*1、裁判等待队员准备;
*2、裁判发起起跑通知;
*3、裁判等待各队员到达终点
*/
public class ThreadTest2 {
public static void main(String[] args) {
//出发倒计时
CountDownLatch cdl1=new CountDownLatch(1),//裁判起跑通知
cdl2=new CountDownLatch(3),//准备完毕通知裁判
cdl3=new CountDownLatch(3);//裁判接收到结束通知
ExecutorService threadPool=Executors.newCachedThreadPool();
for(int i=0;i<3;i++){
threadPool.execute(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("队员"+Thread.currentThread().getName()+"准备完毕");
cdl2.countDown();
try {
cdl1.await();
System.out.println("队员"+Thread.currentThread().getName()+"出发");
Thread.sleep(new Random().nextInt(5)*1000);
System.out.println("队员"+Thread.currentThread().getName()+"到达终点");
cdl3.countDown();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
System.out.println("裁判等待所有队员准备完毕");
try {
cdl2.await();
Thread.sleep(new Random().nextInt(3)*1000);
System.out.println("开始");
cdl1.countDown();
System.out.println("裁判等待所有队员结束");
cdl3.await();
System.out.println("GOOD GAME!");
threadPool.shutdown();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}