class="java">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号?
?
?
?
?
?
?
?
?
?