import java.util.Queue;
import java.util.Random;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
*
* 使用CountDownLatch来模拟马拉松比赛
*
* @author 杨尚川
*/
public class MarathonSimulator {
public static void main(String[] args) throws Exception{
ExecutorService executorService = Executors.newCachedThreadPool();
int personCount = 3;
final CountDownLatch prepare = new CountDownLatch(personCount);
final CountDownLatch start = new CountDownLatch(1);
final CountDownLatch end = new CountDownLatch(personCount);
final Queue<String> queue = new ConcurrentLinkedQueue<>();
if(personCount < 3){
System.out.println("参赛人数必须 > 2");
return;
}
for(int i=1; i<=personCount; i++){
final int personNumber = i;
executorService.submit(new Runnable() {
@Override
public void run() {
//模拟准备时间,使用随机数
try{
Thread.sleep(new Random(personNumber).nextInt(1000));
}catch(Exception e){}
System.out.println(personNumber+"号运动员准备完毕");
prepare.countDown();
try {
//等待开始跑的命令
start.await();
}catch (Exception e){}
System.out.println(personNumber+"号运动员开始跑");
long s = System.currentTimeMillis();
//模拟跑步时间,使用随机数
try{
Thread.sleep(new Random(personNumber).nextInt(10000));
}catch(Exception e){}
long c = System.currentTimeMillis() - s;
System.out.println(personNumber+"号运动员到达目的地,耗时:"+c+"毫秒");
end.countDown();
queue.add(personNumber+"号");
}
});
}
System.out.println("有"+personCount+"名运动员参加本次的马拉松比赛");
System.out.println("教练在等待运动员准备...\n");
prepare.await();
System.out.println("\n所有运动员准备完毕,教练开始喊:预备 --- 跑!");
start.countDown();
System.out.println("\n教练在等待所有的运动员跑完...\n");
end.await();
System.out.println("\n所有运动员都跑完了,开始颁奖啦:");
System.out.println("冠军是:"+queue.poll());
System.out.println("亚军是:"+queue.poll());
System.out.println("季军是:"+queue.poll());
executorService.shutdown();
}
}
10人参加比赛程序运行之后的输出结果: 有10名运动员参加本次的马拉松比赛 教练在等待运动员准备... 2号运动员准备完毕 10号运动员准备完毕 7号运动员准备完毕 8号运动员准备完毕 5号运动员准备完毕 6号运动员准备完毕 3号运动员准备完毕 4号运动员准备完毕 1号运动员准备完毕 9号运动员准备完毕 所有运动员准备完毕,教练开始喊:预备 --- 跑! 教练在等待所有的运动员跑完... 2号运动员开始跑 7号运动员开始跑 3号运动员开始跑 4号运动员开始跑 9号运动员开始跑 10号运动员开始跑 1号运动员开始跑 6号运动员开始跑 5号运动员开始跑 8号运动员开始跑 4号运动员到达目的地,耗时:1866毫秒 8号运动员到达目的地,耗时:2367毫秒 3号运动员到达目的地,耗时:3736毫秒 7号运动员到达目的地,耗时:4241毫秒 2号运动员到达目的地,耗时:6113毫秒 6号运动员到达目的地,耗时:6616毫秒 10号运动员到达目的地,耗时:7117毫秒 1号运动员到达目的地,耗时:8989毫秒 5号运动员到达目的地,耗时:9491毫秒 9号运动员到达目的地,耗时:9993毫秒 所有运动员都跑完了,开始颁奖啦: 冠军是:4号 亚军是:8号 季军是:3号 3人参加比赛程序运行之后的输出结果: 有3名运动员参加本次的马拉松比赛 教练在等待运动员准备... 2号运动员准备完毕 3号运动员准备完毕 1号运动员准备完毕 所有运动员准备完毕,教练开始喊:预备 --- 跑! 教练在等待所有的运动员跑完... 2号运动员开始跑 1号运动员开始跑 3号运动员开始跑 3号运动员到达目的地,耗时:3737毫秒 2号运动员到达目的地,耗时:6112毫秒 1号运动员到达目的地,耗时:8990毫秒 所有运动员都跑完了,开始颁奖啦: 冠军是:3号 亚军是:2号 季军是:1号