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号
相关推荐
递减锁存器CountDownLatch的使用以及注意事项!
java并发编程中CountDownLatch和CyclicBarrier的使用借鉴.pdf
《java并发编程》中CountDownLatch和CyclicBarrier用法实例大全,几乎包含了所有重要的用法
主要介绍了如何使用CountDownLatch同步java多线程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
利用 CountDownLatch 类实现线程同步,而不用回调机制。详见我的博文 http://blog.csdn.net/kroclin/article/details/37956949
目录 CountDownLatch是什么? CountDownLatch如何工作? 在实时系统中的应用场景 应用范例 常见的面试题 代码样例
在网上找的一个CountDownLatch的学习demo,感觉很不错,就摘抄过来了
Java并发编程一CountDownLatch、CyclicBarrier、Semaphore初使用 CountDownLatch、CyclicBarrier、Semaphore这些线程协作工具类是基于AQS的,看完这篇博客后可以去看下面这篇博客,了解它们是如何实现的。 Java并发...
CountDownLatch与thread.join()的区别
CountDownLatch Demo
3.2 使用CountDownLatch实现同步 主线程等待多个线程完成 4.1 场景介绍 4.2 使用CountDownLatch实现等待 CountDownLatch的其他应用场景 5.1 倒计时计时器 5.2 同时开始任务 5.3 等待多个资源就绪 CountDownLatch与...
NULL 博文链接:https://cpjsjxy.iteye.com/blog/2272451
主要为大家详细介绍了使用CountDownLatch等待多线程全部执行完成,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
mybaits 多线程 实现数据批量插入 (运用CountDownLatch实现闭锁) 1、mybatis批处理 2、数据分批量查询 3、数据分批量插入
文章目录1 原理简介2 具体使用方法2.1 demo1 — await不传入时间,保证当前线程的其他操作在最后执行2.2 demo2 — await传入时间t,当前线程等其他线程时间t后就运行其他操作2.3 发令枪 源码地址:...
并发编程之CountDownLatch
java并发编程中CountDownLatch和CyclicBarrier的使用.pdf
主要介绍了JAVA多线程CountDownLatch的使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
主要为大家详细介绍了CountDownLatch的使用说明,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
CountDownLatch是一个同步工具类,它通过一个计数器来实现的,初始值为线程的数量。每当一个线程完成了自己的任务,计数器的值就相应得减1。当计数器到达0时,表示所有的线程都已执行完毕,然后在等待的线程就可以恢复...