java多线程百米赛跑_多线程-百米赛跑
题目:百米赛跑
10个运动员进行百米赛跑,要求:
1.同时起跑
2.所有运动员都到达终点才算比赛结束
3.输出成绩排名
import java.util.ArrayList;
9/**
10 *
11 * 通过CountDownLatch和CyclicBarrier实现运动员赛跑准备->发令枪开跑->到达终点计算成绩
15 */
16public class CountDownLatchTest1 {
18 运动员数量量
19 private static int SPORTSMAN_COUNT = 10;
20
21 private static final Random random = new Random();
23 ?用于判断发令之前运动员是否已经进?入准备状态,需要等待10个运动员准备就绪,占有锁,等待10个运动员完成,释放锁。
24 private static CountDownLatch readyLatch = new CountDownLatch(SPORTSMAN_COUNT);
25 // ?用于判断裁判是否已经发令,占有锁,等待裁判发令完成,释放锁
26 private static CountDownLatch startLatch = new CountDownLatch(1);
27 // 设置终点屏障,?用于计算成绩
28 private static CyclicBarrier cb = new CyclicBarrier(SPORTSMAN_COUNT, new Runnable() { 29
30 @Override
31 public void run() {
32
33 CountDownLatchTest1.transcript
34 .sort((Sportsman p1, Sportsman p2) -> p1.getTranscript() - p2.getTranscript());
35
36 System.out.println("排名成绩单:" + CountDownLatchTest1.transcript);
37
38 CountDownLatchTest1.transcript.clear();
39 }
40 });
41
42 // 成绩单
43 private static List transcript = new ArrayList(SPORTSMAN_COUNT);
44
45 public static void main(String[] args) {
47 ?用于判断发令之前运动员是否已经进?入准备状态,需要等待10个运动员准备就绪,占有锁,等待10 个运动员完成,释放锁。
48 // CountDownLatch readyLatch = new CountDownLatch(SPORTSMAN_COUNT);
49 // ?用于判断裁判是否已经发令,占有锁,等待裁判发令完成,释放锁
50 // CountDownLatch startLatch = new CountDownLatch(1);
52 启动10个线程,也就是10个运动员,做准备?工作
53 for (int i = 0; i < SPORTSMAN_COUNT; i++) {
54 Thread t = new Thread(new RunTask((i + 1) + "号运动员", readyLatch, startLatch));
55 t.start();
57 //当前运动员在其他运动员准备就绪前?一直等待,也就是说等readyLatch倒数计数器?为0之前?一直等待
58 try {
59 readyLatch.await();
60 } catch (InterruptedException e) {
61 e.printStackTrace();
63 // 裁判发令,释放锁
64 startLatch.countDown();
65 System.out.println("裁判:所有运动员准备完毕,开始跑...");
66
67 }
68
69 // 运动员
70 static class Sportsman { 71 private String name;
72 private int transcript;
73
74 public Sportsman(String name, int transcript) {
75 this.name = name;
76 this.transcript = transcript;
77 }
78
79 @Override
80 public boolean equals(Object obj) { 81 boolean result = false;
82 if (obj instanceof Sportsman) {
83 result = ((Sportsman) obj).getTranscript() == this.transcript;
84 }
85 return result;
86 }
87
88 @Override
89 public String toString() {
90 return this.name + ":" + this.transcript + " ms";
91 }
92
93 public String getName() {
94 return name;
95 }
96
97 public int getTranscript() {
98 return transcript;
99 }
100
101 }
102
103 // 跑任务
104 static class RunTask implements Runnable { 105
106 private Lock lock = new ReentrantLock();
107
108 private CountDownLatch ready;
109 private CountDownLatch start;
110 private String name;
111
112 /**
113 *
114 * (构造?方法)
115 *
116 * @param ready
117 * @param start
118 * @param name 运动员名称
119 */
120 public RunTask(String name, CountDownLatch ready, CountDownLatch start) {
121 this.ready = ready;
122 this.start = start;
123 this.name = name;
124 }
125
126 @Override
127 public void run() {
128 lock.lock();
129 try {
130
131 // 1. 写运动员准备就绪的逻辑,准备readyTime秒
132 int readyTime = random.nextInt(1000);
133 System.out.println(name + ":我需要" + readyTime + "秒的时间准备。");
134 try {
135 Thread.sleep(readyTime);
136 } catch (InterruptedException e) {
137 e.printStackTrace();
138 }
139 System.out.println(name + "我已经准备完毕!"); 140 // 释放锁readyLatch-1,表示?一个运动员已经就绪
141 ready.countDown();
143 待裁判发开始命令
144 start.await();
145 } catch (InterruptedException e) {
146
147 }
148 System.out.println(name + ":开跑...");
149 int costTime = random.nextInt(500);
150 try {
151 Thread.sleep(costTime);
152 } catch (InterruptedException e) {
153 e.printStackTrace();
154 }
155 System.out.println(name + ":开跑到达终点。成绩:" + costTime + "ms");
156 transcript.add(new Sportsman(name, costTime));
157 // 等待成绩
158 cb.await();
159 } catch (Exception e) {
160
161 } finally {
162 lock.unlock();
163 }
164
165 }
166
167 }
168
169}
原文:https://www.cnblogs.com/cdlyy/p/12061146.html
java多线程百米赛跑_多线程-百米赛跑相关推荐
- java timer 线程安全_多线程之 线程安全与控制
线程控制 wait和notify方法需要注意的细节:wait方法与notify方法必须要由同一个锁对象调用.因为:对应的锁对象可以通过notify唤醒使用同一个锁对 象调用的wait方法后的线程. w ...
- java 多线程不安全_多线程并发为什么不安全
一.线程安全定义 定义: 多个线程访问同一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他操作,调用这个对象的行为都可以获得正确的结果 ...
- java中解决脏读_多线程出现脏读以及解决方法(使用synchronized)
使用多线程出现脏读,得到的结果不是设计时想要的怎么办呢? 直接看示例: 出现脏读的程序 DealThread.java public class DealThread implements Runna ...
- java runnable线程锁_多线程 java 同步 、锁 、 synchronized 、 Thread 、 Runnable
线程 1 线程概述 1.1 什么是线程 v 线程是程序执行的一条路径, 一个进程中可以包含多条线程 v 一个应用程序可以理解成就是一个进程 v 多线程并发执行可以提高程序的效率, 可以同时完成多 ...
- java多线程 注意事项_多线程使用及注意事项
1.并行和并发的区别 2.多线程(高并发编程)的优点 3.多线程程序需要注意事项 4.线程的启动与安全中止 5.怎么安全中止线程(interrupt()) 并行和并发的区别: 一个是同时执行,一个是交 ...
- java多线程 丢数据_多线程list.add()丢数据
问题: 根据项目业务需求需要统计数据传到前台以图表显示,每天数据量大概20万多,但是每次统计只能统计出10万的数据量,出现数据丢失. 原因: 该接口在之前一次优化时加了多线程,但是数据汇总用的仍是Ar ...
- java线程条件变量_多线程同步条件变量(转载)
最近看<UNIX环境高级编程>多线程同步,看到他举例说条件变量pthread_cond_t怎么用,愣是没有看懂,只好在网上找了份代码,跑了跑,才弄明白 #include #include ...
- java 线程 单例_多线程单例模式
多线程单例模式 原文:https://blog.csdn.net/u011726005/article/details/82356538 1. 饿汉模式 使用饿汉模式实现单例是十分简单的,并且有效避免 ...
- java线程锁机制_多线程之锁机制
前言 在Java并发编程实战,会经常遇到多个线程访问同一个资源的情况,这个时候就需要维护数据的一致性,否则会出现各种数据错误,其中一种同步方式就是利用Synchronized关键字执行锁机制,锁机制是 ...
最新文章
- 天猫总裁靖捷回答了今年双11的热点问题
- python学费多少-Python开发学费一般多少钱?
- 服务器数据恢复难题--操作系统恢复的方法和思路
- [导入]创建笔 (Visual C#)
- signal.h 中的宏定义 SIG_DFL 及 SIG_IGN
- 策略模式应用场景和uml_策略模式
- 没啥好标题才显得有逼格对叭-CSDN
- r语言做断轴_R语言用nls做非线性回归以及函数模型的参数估计
- 自定义taglib引入失败_小程序拼团总失败?看看微信官方和开发者们怎么说
- ubuntu中vscode配置python_ubuntu下vs code的python虚拟环境的配置
- 容器编排技术 -- Kubernetes kubectl create secret docker-registry 命令详解
- ES6 中的 Symbol 是什么?
- 微信小程序:独立后台带分销功能月老办事处交友盲盒
- word多级标题的使用
- 盐城机电高等职业技术学校计算机专业,盐城机电高等职业技术学校
- 基于Android平台的x264的移植与应用(一):移植篇
- SURF算法之Opencv代码详解
- 编程累了进来听听音乐
- 简单工厂方法模式(Simple Factory Methord)
- 从头搭建一个“微博”有多难
热门文章
- 一文搞懂Nginx限流(简单实现)
- Android粗浅系统学习(适合入门)
- cpu 分支预测对性能的影响
- python考试代码复制_笨办法学Python 习题 26: 恭喜你,现在可以考试了! 错误代码下载链接...
- 芝加哥大学计算机科学在哪个学院,芝加哥大学计算机专业怎么样?
- 芝加哥大学计算机科学,芝加哥大学计算机科学排名第32(2018年TFE美国排名)
- 2013——自我反思
- dede实现手机wap浏览
- 织梦wap.php怎么改,利用DEDECMS织梦建立wap站
- 新华三发布《中国城市数字经济指数白皮书(2019)》,融绘数字中国蓝图用数据记录城市数字化转型进程!