当前位置: 首页 > news >正文

Java多线程--实现跑马小游戏

线程的实现方式

  1. 继承Thread类:void run()方法没有返回值,无法抛异常
  2. 实现Runnable接口:void run()方法没有返回值,无法抛异常
  3. 实现Callable接口:V call() throws Exception 返回结果,能够抛异常

实现Callable接口

(1)创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,并且有返回值。

(2)创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。

(3)使用FutureTask对象作为Thread对象的target创建并启动新线程。

(4)调用FutureTask对象的get()方法来获得子线程执行结束后的返回值

任务

四匹马,跑一千米比赛,每匹马的速度通过1~10的随机数来产生,输出哪匹马是冠军

RunTask1.java代码:

import java.util.Random;
import java.util.concurrent.Callable;/*** 跑步任务*/public class RunTask1 implements Callable<Long> {// step/100ms 是否睡着 睡觉时间// 通过方法形参接收参数// 定义属性private int step;private boolean isSleep;private int sleepTime;public RunTask1(int step,boolean isSleep,int sleepTime){this.step=step;this.isSleep=isSleep;this.sleepTime=sleepTime;}@Overridepublic Long call() throws Exception {int distance=0;long start = System.currentTimeMillis();while(true){distance+=step;if (isSleep) {if (distance == 800) { //跑到800米try {System.out.println(Thread.currentThread().getName() + "睡" + sleepTime + "ms");Thread.sleep(sleepTime);} catch (InterruptedException e) {e.printStackTrace();}}}if(distance>=1000){break;}System.out.println(Thread.currentThread().getName() + "跑完" + distance + "米");}try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}return System.currentTimeMillis()-start;}
}

 Test.java代码

import java.util.Random;
import java.util.concurrent.FutureTask;public class Test {public static void main(String[] args) throws Exception {//第一匹马的跑步任务RunTask1 horse1=new RunTask1(new Random().nextInt(10)+1,true,200);FutureTask<Long> horseResult = new FutureTask<>(horse1);Thread t1=new Thread(horseResult,"马1");//第二匹马的跑步任务RunTask1 horse2=new RunTask1(new Random().nextInt(10)+1,true,400);FutureTask<Long> horseResult1 = new FutureTask<>(horse2);Thread t2=new Thread(horseResult1,"马2");//第三匹马的跑步任务RunTask1 horse3=new RunTask1(new Random().nextInt(10)+1,true,5500);FutureTask<Long> horseResult2 = new FutureTask<>(horse3);Thread t3=new Thread(horseResult2,"马3");//第四匹马的跑步任务RunTask1 horse4=new RunTask1(new Random().nextInt(10)+1,false,0);FutureTask<Long> horseResult3 = new FutureTask<>(horse4);Thread t4=new Thread(horseResult3,"马4");t1.start();t2.start();t3.start();t4.start();//统计比赛结果,一定要等main线程执行,否则, Horse1的线程还没跑完,就输出了winner is Horse2if((horseResult.get().longValue() < horseResult1.get().longValue()) && (horseResult.get().longValue() < horseResult2.get().longValue()) && (horseResult.get().longValue() < horseResult3.get().longValue())){System.out.println("winner is "+t1.getName());}else if((horseResult1.get().longValue() < horseResult.get().longValue()) && (horseResult1.get().longValue() < horseResult2.get().longValue()) && (horseResult1.get().longValue() < horseResult3.get().longValue())){System.out.println("winner is "+t2.getName());}else if((horseResult2.get().longValue() < horseResult.get().longValue()) && (horseResult2.get().longValue() < horseResult1.get().longValue()) && (horseResult2.get().longValue() < horseResult3.get().longValue())){System.out.println("winner is "+t3.getName());}else if(horseResult3.get().longValue() < horseResult.get().longValue() && (horseResult3.get().longValue() < horseResult1.get().longValue()) && (horseResult3.get().longValue() < horseResult2.get().longValue())){System.out.println("winner is "+t4.getName());}else System.out.println("平局");}
}

控制台输出,想要结果不一样,可以通过设置哪一匹马会睡眠,从而改变结果,代码还是有不足:

http://www.lryc.cn/news/462188.html

相关文章:

  • 扫雷(C 语言)
  • 有源滤波器(一)
  • Flume面试整理-常见的Channel类型
  • 【前端】如何制作一个自己的网页(6)
  • Linux系统性能调优技巧
  • 数学建模算法与应用 第5章 插值与拟合方法
  • 3D Slicer 教程二 ---- 数据集
  • 【建议收藏】30个Java异常的知识点,你能撑到第几个?
  • 【Linux系统编程】环境基础开发工具使用
  • 滚雪球学Redis[6.2讲]:Redis脚本与Lua:深入掌握Redis中的高效编程技巧
  • 上市不到一月,极氪7X交付破万台!论纯电,极氪真“遥遥领先”
  • 【Linux】理解文件系统与软硬链接,观察inode号理解<“软链接是包含路径的新文件“,“硬链接是关于文件名的机制“>,最终明白<什么是真正删除一个文件>
  • Java高并发控制之按业务对象加同步锁
  • Python魔法函数__iter__的用法
  • Redis-缓存一致性
  • SAP学习笔记 - 豆知识13 - Msg 番号 NR751 - Object RF_BELEG R100、番号範囲間隔 49 不存在 FBN1
  • 美摄科技云服务解决方案,方案成熟,接入简单
  • 【bug】paddleocr draw_ocr_box_txt ValueError: incorrect coordinate type
  • python的多线程和多进程
  • 基于SpringBoot+Vue+uniapp的时间管理小程序的详细设计和实现(源码+lw+部署文档+讲解等)
  • HMAC-MD5参数签名算法
  • 【word】文章里的表格边框是双杠
  • 我常用的两个单例模式写法 (继承Mono和不继承Mono的)
  • Android 自定义Toast显示View
  • SCRM呼叫中心高保真Axure原型 源文件分享
  • Ubuntu(Linux)tcpdump使用方法详解
  • Centos安装Nginx 非Docker
  • 免费版的音频剪辑软件:这四款有没有你的菜?
  • Facebook的隐私之战:数据保护的挑战与未来
  • 自定义注解和组件扫描在Spring Boot中动态注册Bean(二)