利用CountDownLatch模擬跑步比賽.
要點
1.await().//當計數器不爲0的時候,阻塞線程。
2.countDown().//技術器減1.
//測試創建啓動類
public class CountDownLatchMatch {
public static void main(String[] args) throws InterruptedException {
CountDownLatch coming = new CountDownLatch(10);
CountDownLatch waiting = new CountDownLatch(1);
CountDownLatch waitToRace = new CountDownLatch(10);
CountDownLatch startRace = new CountDownLatch(1);
CountDownLatch endRace = new CountDownLatch(10);
MyService myService = new MyService(coming, waiting,waitToRace, startRace, endRace);
Mythread []mythread = new Mythread[10];
for(int i=0;i<10;i++){
mythread[i] = new Mythread(myService);
mythread[i].setName(i+1+"號運動員");
mythread[i].start();
}
System.out.println("裁判正在等待運動員到達.");
coming.await();
// Thread.sleep(2000);
System.out.println("****運動員全部到達起始點******");
waiting.countDown();
waitToRace.await();
System.out.println("****運動員全部到已經準備好*****");
startRace.countDown();
endRace.await();
System.out.println("****比賽結束!****");
}
}
//創建自定義線程
public class Mythread extends Thread{
private MyService myService;
public Mythread(MyService myService) {
this.myService = myService;
}
@Override
public void run() {
try {
myService.testMethod();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}// 創建service
public class MyService {
CountDownLatch coming;
CountDownLatch waiting;
CountDownLatch waitToRace;
CountDownLatch startRace;
CountDownLatch endRace;
public MyService(CountDownLatch coming,CountDownLatch waiting,CountDownLatch waitToRace,CountDownLatch startRace,CountDownLatch endRace)
{
this.coming = coming;
this.waiting = waiting;
this.waitToRace = waitToRace;
this.startRace = startRace;
this.endRace = endRace;
}
public void testMethod() throws InterruptedException{
System.out.println("運動員 開始往起跑點方向走.");
Thread.sleep((int)Math.random()*10000 );
System.out.println("運動員 "+Thread.currentThread().getName()+"到達起始點.");
coming.countDown();
waiting.await();
System.out.println("裁判宣佈準備跑了.");
System.out.println(Thread.currentThread().getName()+"已經準備好");
waitToRace.countDown();
startRace.await();
System.out.println(Thread.currentThread().getName()+"已經跑完.計時不詳");
endRace.countDown();
}
}