Java模拟百米比赛
最近做笔试遇到一个题,要编程模拟百米比赛,现在给它稍微做得完整一点的!
代码如下:
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;public class Main {public static void main(String[] args) {// 模拟8个短跑运动员的速度大决战Competition competition = new Competition(8);try {competition.race();} catch (InterruptedException e) {e.printStackTrace();}}
}class Competition {private final int runnerCount;Competition(int runnerCount) {this.runnerCount = runnerCount;}public void race() throws InterruptedException {Signal.begin = new CountDownLatch(1);Signal.end = new CountDownLatch(runnerCount);System.out.println("人类速度大决战,百米决赛即将开始!");for (int i = 0; i < runnerCount; i++) {TimeUnit.MILLISECONDS.sleep(500);System.out.print("# ");}System.out.println();// 运动员准备for (int i = 1; i <= runnerCount; i++) {new Thread(new Runner(i)).start();}// 裁判下令比赛开始new Thread(new Referee()).start();Signal.end.await();// 比赛结束,对成绩排序List<Map.Entry<Integer, Double>> scoreList = new ArrayList<>(Score.scoreMap.entrySet());scoreList.sort((e1, e2) -> {if (e1.getValue() > e2.getValue()) {return 1;}return -1;});// 打印成绩System.out.println("\n比赛结束!成绩如下:");int order = 1;for (Map.Entry<Integer, Double> e : scoreList) {System.out.printf("第%d名:%d号运动员 : %.3f秒!...起跑反应时间:%.3f秒\n",order, e.getKey(), e.getValue(), Score.startTimeMap.get(e.getKey()));order++;}}
}class Runner implements Runnable {private final int id;Runner(int id) {this.id = id;}@Overridepublic void run() {Random random = new Random();try {// 运动员等待起跑信号Signal.begin.await();long start = System.currentTimeMillis();// 起跑反应时间在0.1秒到0.3秒之间double startTime = (1.0 + random.nextDouble() * 2.0) / 10.0;TimeUnit.MILLISECONDS.sleep((long) (startTime * 1000));System.out.println(id + "号运动员起跑了...");// 假设每个运动员跑完100米的时间在9.58秒到(9.58+3)秒之间TimeUnit.MILLISECONDS.sleep((long) (9580 + (random.nextDouble() * 3.0) * 1000));long end = System.currentTimeMillis();double score = (end - start) / 1000.0;System.out.printf("%d号运动员到达终点了...用时%.3f秒!\n", id, score);Signal.end.countDown();// 记录成绩Score.scoreMap.put(id, score);Score.startTimeMap.put(id, startTime);} catch (InterruptedException e) {e.printStackTrace();}}
}class Referee implements Runnable {@Overridepublic void run() {System.out.println("比赛开始...");Signal.begin.countDown();}
}class Signal {public static CountDownLatch begin;public static CountDownLatch end;
}class Score {public static Map<Integer, Double> scoreMap = new ConcurrentHashMap<>();public static Map<Integer, Double> startTimeMap = new ConcurrentHashMap<>();
}
运行效果:
Java模拟百米比赛相关推荐
- java模拟乒乓球比赛
java通过随机数模拟乒乓球比赛 package MyJava;import java.util.ArrayList; import java.util.Random;public class Tes ...
- Java多线程模拟运动比赛
Java的并发包中有各种并发类,今天通过这个例子来熟悉使用CyclicBarrier类. CyclicBarrier类就像一个起跑线,定义了赛道的大小,当所有运动员(多线程)同时在起跑线, 那么Cyc ...
- Java Fx 小程序模拟赛马比赛
描述: 设计一个模拟赛马比赛的软件,动画显示赛马的过程. 功能要求: 1.每局的马匹数可以设置(例如8匹马) 2.设计界面,可以填入和保存每匹马的相关参数包括:力量(与加速度相关).耐力(与持久力相关 ...
- 使用CountDownLatch来模拟马拉松比赛
2019独角兽企业重金招聘Python工程师标准>>> import java.util.Queue; import java.util.Random; import java.ut ...
- 使用CyclicBarrier模拟百米赛跑
使用CyclicBarrier模拟百米赛跑 什么是CyclicBarrier 怎么使用CyclicBarrier 使用CyclicBarrier模拟百米赛跑 大概流程: 原代码 输出结果 什么是Cyc ...
- java 模拟时钟_java模拟时钟
本次课程设计采用时间片轮转调度算法来实现模拟进程调度任务的执行过 程. 用 Java 模拟进程调度过程,可以方便地将运行结果直观地表示出来.Java 语言 独有的多...... 本次课程设计采用时间片 ...
- 233网校java_java辅导:使用java模拟登陆考试大
java辅导:使用java模拟登陆考试大 2009年1月5日来源:233网校网校课程 在线题库评论 分享到 public static void loginexamda() { URL url = n ...
- JAVA同时输入用户名和密码_用java模拟设计一个简单的“用户注册”程序。当用户输入用户名和密码时,单击“注...
用java模拟设计一个简单的"用户注册"程序.当用户输入用户名和密码时,单击"注 2020 - 9 - 26 TAG : 所有功能均已实现,如有不满意的地方我再修改imp ...
- 用Java模拟multipart形式的Http Post请求
本例通过java模拟了Http的request请求,请求格式为multipart,实现了向服务器同时传递json数据和图片数据. 1 import java.io.ByteArrayOutputStr ...
最新文章
- 人民广场怎么走? 地铁换乘算法的实现 MikeTech | MikeTech
- 编程之美---点是否在三角形内
- 表的插入、更新、删除、合并操作_8_手工插入数据
- SpringMVC的请求-获得请求参数-获得基本类型参数
- 解决org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)错误
- python答疑的作用_不学Python之集中答疑(5)
- python嵌套列表操作_python基础(list列表的操作,公共方法,列表嵌套,元祖)...
- onedrive电脑手机不同步_免费的手机电脑同步便签软件怎么找?求帮忙推荐
- 分治 —— 莫队算法
- Python+matplotlib绘图使用Latex引擎渲染坐标轴刻度文本上标
- OSChina 周六乱弹 —— 知道今天的乱弹为什么会迟发吗?
- Discuz常见小问题-如何关闭验证码
- LeetCode84 Largest Rectangle in Histogram
- 徐州2018年大学计算机比赛,2018年第四届徐州市中小学生学科综合能力大赛获奖名单!权威发布!【五年级】...
- lumion建筑可视化2.5小时的真实感渲染教程
- QQ小程序激励广告接入与使用
- APT(Android Performance Testing Tools)安卓平台高效性能测试工具
- 51单片机-波特率的计算定时器初始值的计算
- html目录链接怎么做,word目录超链接怎么做
- 济南市高新技术企业认定补助