文档章节

使用CountDownLatch来模拟马拉松比赛

杨尚川
 杨尚川
发布于 2015/03/11 16:04
字数 941
阅读 186
收藏 2
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号


© 著作权归作者所有

杨尚川

杨尚川

粉丝 1103
博文 220
码字总数 1624053
作品 12
东城
架构师
私信 提问
Java模拟赛跑过程

Java并发面试中的一个经典问题——手写代码模拟赛跑过程。该问题考查CountDownLatch的用法,比Java实现生产者-消费者模型的考查更直接: 对Java并发模型的理解 对Java并发编程接口(CountDo...

monkeysayhi
2017/11/27
0
0
Java模拟赛跑过程

Java并发面试中的一个经典问题——手写代码模拟赛跑过程。该问题考查CountDownLatch的用法,比Java实现生产者-消费者模型的考查更直接: 对Java并发模型的理解 对Java并发编程接口(CountDo...

猴子007
2017/10/11
0
0
同步工具类:CountDownLatch、CyclicBarrier和Exchanger

CountDownLatch 1.1说明: CountDownLatch可以理解为一个计数器在初始化时设置初始值,当一个线程需要等待某些操作先完成时,需要调用await()方法。这个方法让线程进入休眠状态直到等待的所有...

moonlightX
2018/07/28
6
0
JAVA CAS技术运用于多线程(Unsafe)

![在此输入图片描述][1] [1]: http://static.oschina.net/uploads/space/2013/1004/203958_qJ0a_177808.jpg 我们来测试如下代码,注意代码的写法: 1、普通的写法: if (unsafe_var == 23) ...

P&H
2013/10/04
3K
0
Java并发编程中级篇(三):使用CountDownLatch控制多线程并发等待

你是否遇到这这样一种情况,我们要举行一个视频会议,有若干的参会人员,需要等待所有的人员到齐后视频会议才能开始。 为了解决这个问题,Java API提供了一个线程同步辅助类CountDownLatch,...

阿拉德大陆的魔法师
2016/11/26
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

lopatkin俄大神Windows精简版系统 安装教程 简单版

1.制作U盘启动盘 或 安装pe到电脑 下载微pe工具箱.(为什么用这个呢,因为这个无毒,无广告,无后门.其它pe在安装完系统会安装一堆木马,垃圾软件,后门什么的) pe制作工具下载http://www.wepe.com...

xiaogg
19分钟前
3
0
【0917】Linux shell基础知识2

【0917】Linux shell基础知识2 8.7/8.8 shell变量 8.9 环境变量配置文件 8.10 shell特殊符号cut命令 8.11 sort_wc_uniq命令 8.12 tee_tr_split命令 8.13 shell特殊符号 一、shell变量 1、使用...

飞翔的竹蜻蜓
21分钟前
3
0
管理角色认知-新晋管理常常犯的错

背景 管理是一门实践科学,从知道到做到,需要长时间的刻意练习,提前知道那些坑,可以提前规避。 坑1:被动执行 现象: 不主动找活干,等上级派活; 上级有了安排,指望上级替他决定实现方案...

春天spring
23分钟前
4
0
MongoDB4.0.2集群搭建

MongoDB4.0.2集群搭建 2019.02.01 01:02 619浏览 MongoDB4.0.2集群搭建 根据对象存储平台Django+MongoDB+Ceph的需求,现搭建部署一个十节点的MongoDB集群,主要以下关键点: 根据最新版本Mon...

linjin200
26分钟前
5
0
面试官问你B树和B+树,就把这篇文章丢给他

原文链接:面试官问你B树和B+树,就把这篇文章丢给他 1 B树 在介绍B+树之前, 先简单的介绍一下B树,这两种数据结构既有相似之处,也有他们的区别,最后,我们也会对比一下这两种数据结构的区...

欧阳思海
30分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部