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