java多執行緒:13、CountDownLatch同步輔助類【計數器】
阿新 • • 發佈:2019-01-29
使用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();
}
}
}