1. 程式人生 > >java多執行緒:13、CountDownLatch同步輔助類【計數器】

java多執行緒:13、CountDownLatch同步輔助類【計數器】

使用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(); } } }