赛马游戏

前言

最近在看CountDownLatch和CyclicBarrier相关的锁知识,看到网上有通过CyclicBarrier特性实现一个赛马游戏,觉得很有意思,就把他搬运过来。

背景

多匹马一起赛跑,每匹马每一次都可以跑随机个距离,看哪匹马最先到达终点。

代码

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;class Horse implements Runnable {private static int counter = 0;private final int id = counter++;private int strides = 0;private static Random rand = new Random(47);private static CyclicBarrier barrier;public Horse(CyclicBarrier b) { barrier = b; }@Overridepublic void run() {try {while(!Thread.interrupted()) {synchronized(this) {//赛马每次随机跑几步strides += rand.nextInt(3);}barrier.await();}} catch(Exception e) {e.printStackTrace();}}public String tracks() {StringBuilder s = new StringBuilder();for(int i = 0; i < getStrides(); i++) {s.append("*");}s.append(id);return s.toString();}public synchronized int getStrides() { return strides; }public String toString() { return "Horse " + id + " "; }}public class HorseRace implements Runnable {private static final int FINISH_LINE = 75;private static List<Horse> horses = new ArrayList<Horse>();private static ExecutorService exec = Executors.newCachedThreadPool();@Overridepublic void run() {StringBuilder s = new StringBuilder();//打印赛道边界for(int i = 0; i < FINISH_LINE; i++) {s.append("=");}System.out.println(s);//打印赛马轨迹for(Horse horse : horses) {System.out.println(horse.tracks());}//判断是否结束for(Horse horse : horses) {if(horse.getStrides() >= FINISH_LINE) {System.out.println(horse + "won!");exec.shutdownNow();return;}}//休息指定时间再到下一轮try {TimeUnit.MILLISECONDS.sleep(200);} catch(InterruptedException e) {System.out.println("barrier-action sleep interrupted");}}public static void main(String[] args) {CyclicBarrier barrier = new CyclicBarrier(7, new HorseRace());for(int i = 0; i < 7; i++) {Horse horse = new Horse(barrier);horses.add(horse);exec.execute(horse);}}
}

代码出处

https://blog.csdn.net/qq_39241239/article/details/87030142

利用CyclicBarrier实现赛马游戏相关推荐

  1. CyclicBarrier实现赛马游戏

    CyclicBarrier实现赛马游戏 import java.util.ArrayList; import java.util.List; import java.util.Random; impo ...

  2. 从赛马游戏看CyclicBarrier,从斗地主看CountDownLatch

    CyclicBarrier是栅栏,效果就是让多个线程都执行到某个指定的点之后,再一起继续执行.与CountDownLatch有点类似,最大的区别是CyclicBarrier可以循环使用. 这里举例两个 ...

  3. 模特赛马java课程设计_Thinking in Java---Concurrent包下的新构件学习+赛马游戏仿真...

    Java5的java.util.concurrent包下引入了大量的用于解决并发问题的新类:相对于前面那些基础的线程同步和通信的方法,这些新类是一种更高层次上的抽象,使用起来还是比较容易的.这篇博客就 ...

  4. 输入法注入源码_将注入进行到底:利用Mono注入C#游戏脚本

    本文作者01dTan9,首发于三叶草小组博客:http://blog.sycsec.com/   致力于引领每一位对windows安全感兴趣的萌新,希望让萌新能够对Windows有初步的了解.笔者的文 ...

  5. 如何利用Shader来渲染游戏中的3D角色

    杨航最近在学Unity3D 本文主要介绍一下如何利用Shader来渲染游戏中的3D角色,以及如何利用Unity提供的Surface Shader来书写自定义Shader. 一.从Shader开始 ...

  6. java赛马游戏,用JAVA语言实现赛马游戏

    用JAVA语言实现赛马游戏 用JAVA语言实现赛马游戏 在大二下半学期,学校举办了一场编程比赛.其中一个选题就是:用JAVA语言实现一个赛马游戏程序.此程序即为当时的参赛完成的程序. 程序界面风格在当 ...

  7. java赛马游戏_Java小程序赛马游戏实现过程详解

    这是当时做的一个小游戏,大概就是程序开始后,会进入用户登录界面,用户输入自己的姓名和密码后,选择登录会进入到赛马比赛的界面,这时可以看见赛马场和马匹的编号,用户可以选择任何一个编号的马进行投注,输入有 ...

  8. PEGAXY首创科幻类赛马游戏

    欢迎各位新老朋友,我们细说P2E(Play to Earn),为广大用户提供一个深入了解链游的平台.不定期的跟大家分享一些精品项目和最新链游方向,也欢迎大家关注我们.我们第二十期分享的是Polygon ...

  9. 超简单利用java实现小游戏剪刀石头布

    一.如何利用最简单的语句和方法来实现一个小游戏 在剪刀石头布的小游戏中,游戏有三种情况,赢.输.平局,所以我们可以利用这一点,把三种情况罗列出来进行判断. 二.设计想法 一.因为计算机无法利用石头剪刀 ...

最新文章

  1. 工程介绍好处费性质_水运工程造价工程师继续教育课件上新丨海外水运工程造价编制介绍课程发布...
  2. 安装tomcat出现failed to install tomcat8 service错误及解决方法
  3. M2: XAML Controls(2)
  4. html判断数字数据的大小写,大小写字母,特殊字符,数字,八位及以上四选三,全符合验证...
  5. Abstract class虚拟类
  6. linux---谈谈vfork和fork的区别及exit与return
  7. weblogic部署,常见错误解决——Unmarshaller failed
  8. 大屏监控系统实战(12)-10分钟投票增量曲线制作(一)
  9. 最强战队出炉,2020腾讯广告算法大赛圆满落幕
  10. 《R语言数据挖掘:实用项目解析》——1.9 循环原理——repeat循环
  11. 51单片机LCD1602显示
  12. HybridPose:混合表示下的6D对象姿态估计
  13. 反向传播算法的直观理解
  14. 绕过校园网认证实现免费上网【三端】
  15. 地理信息系统(GIS)网络架构
  16. java8的sorted,Java8排序stream.sorted()
  17. Inno setup 常用修改技巧
  18. 全球及中国千兆路由器行业市场规模调研及投资风险预测报告2022-2028年
  19. key 、primary key 、unique key 与index区别
  20. spring入门例子

热门文章

  1. mysql gis_MySQL的GIS、GEO入门笔记
  2. mysql错误01000_错误 ORA-01000: maximum open cursors exceeded Exception
  3. HTML如何给网页添加icon图标?
  4. 竞品商业情报收集和竞品商业情报分析该怎么做?
  5. 常见处理器MCU、MPU、DSP、FPGA等嵌入式处理器概念
  6. 第5篇-分析北京租房的房源信息
  7. 使用自定义的评价函数优化高NA分束器
  8. kubernetes云原生纪元:共享存储-PVPVC(上)
  9. Python编程:从入门到实践关于pi,百万位圆周率,pi_million_digits.txt,分享给大家
  10. win8.1CPU使用率过高、卡顿、破音问题整理