题目:百米赛跑

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多线程百米赛跑_多线程-百米赛跑相关推荐

  1. java timer 线程安全_多线程之 线程安全与控制

    线程控制 wait和notify方法需要注意的细节:wait方法与notify方法必须要由同一个锁对象调用.因为:对应的锁对象可以通过notify唤醒使用同一个锁对 象调用的wait方法后的线程. w ...

  2. java 多线程不安全_多线程并发为什么不安全

    一.线程安全定义 ​定义: ​多个线程访问同一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他操作,调用这个对象的行为都可以获得正确的结果 ...

  3. java中解决脏读_多线程出现脏读以及解决方法(使用synchronized)

    使用多线程出现脏读,得到的结果不是设计时想要的怎么办呢? 直接看示例: 出现脏读的程序 DealThread.java public class DealThread implements Runna ...

  4. java runnable线程锁_多线程 java 同步 、锁 、 synchronized 、 Thread 、 Runnable

    线程 1 线程概述 1.1 什么是线程 v  线程是程序执行的一条路径, 一个进程中可以包含多条线程 v  一个应用程序可以理解成就是一个进程 v  多线程并发执行可以提高程序的效率, 可以同时完成多 ...

  5. java多线程 注意事项_多线程使用及注意事项

    1.并行和并发的区别 2.多线程(高并发编程)的优点 3.多线程程序需要注意事项 4.线程的启动与安全中止 5.怎么安全中止线程(interrupt()) 并行和并发的区别: 一个是同时执行,一个是交 ...

  6. java多线程 丢数据_多线程list.add()丢数据

    问题: 根据项目业务需求需要统计数据传到前台以图表显示,每天数据量大概20万多,但是每次统计只能统计出10万的数据量,出现数据丢失. 原因: 该接口在之前一次优化时加了多线程,但是数据汇总用的仍是Ar ...

  7. java线程条件变量_多线程同步条件变量(转载)

    最近看<UNIX环境高级编程>多线程同步,看到他举例说条件变量pthread_cond_t怎么用,愣是没有看懂,只好在网上找了份代码,跑了跑,才弄明白 #include #include ...

  8. java 线程 单例_多线程单例模式

    多线程单例模式 原文:https://blog.csdn.net/u011726005/article/details/82356538 1. 饿汉模式 使用饿汉模式实现单例是十分简单的,并且有效避免 ...

  9. java线程锁机制_多线程之锁机制

    前言 在Java并发编程实战,会经常遇到多个线程访问同一个资源的情况,这个时候就需要维护数据的一致性,否则会出现各种数据错误,其中一种同步方式就是利用Synchronized关键字执行锁机制,锁机制是 ...

最新文章

  1. 天猫总裁靖捷回答了今年双11的热点问题
  2. python学费多少-Python开发学费一般多少钱?
  3. 服务器数据恢复难题--操作系统恢复的方法和思路
  4. [导入]创建笔 (Visual C#)
  5. signal.h 中的宏定义 SIG_DFL 及 SIG_IGN
  6. 策略模式应用场景和uml_策略模式
  7. 没啥好标题才显得有逼格对叭-CSDN
  8. r语言做断轴_R语言用nls做非线性回归以及函数模型的参数估计
  9. 自定义taglib引入失败_小程序拼团总失败?看看微信官方和开发者们怎么说
  10. ubuntu中vscode配置python_ubuntu下vs code的python虚拟环境的配置
  11. 容器编排技术 -- Kubernetes kubectl create secret docker-registry 命令详解
  12. ES6 中的 Symbol 是什么?
  13. 微信小程序:独立后台带分销功能月老办事处交友盲盒
  14. word多级标题的使用
  15. 盐城机电高等职业技术学校计算机专业,盐城机电高等职业技术学校
  16. 基于Android平台的x264的移植与应用(一):移植篇
  17. SURF算法之Opencv代码详解
  18. 编程累了进来听听音乐
  19. 简单工厂方法模式(Simple Factory Methord)
  20. 从头搭建一个“微博”有多难

热门文章

  1. 一文搞懂Nginx限流(简单实现)
  2. Android粗浅系统学习(适合入门)
  3. cpu 分支预测对性能的影响
  4. python考试代码复制_笨办法学Python 习题 26: 恭喜你,现在可以考试了! 错误代码下载链接...
  5. 芝加哥大学计算机科学在哪个学院,芝加哥大学计算机专业怎么样?
  6. 芝加哥大学计算机科学,芝加哥大学计算机科学排名第32(2018年TFE美国排名)
  7. 2013——自我反思
  8. dede实现手机wap浏览
  9. 织梦wap.php怎么改,利用DEDECMS织梦建立wap站
  10. 新华三发布《中国城市数字经济指数白皮书(2019)》,融绘数字中国蓝图用数据记录城市数字化转型进程!