Java控制台实现《多线程模拟龟兔赛跑》(实现Runnale接口,重写run()方法)

(温馨提示:本题最重要的是学习思路,代码还有待优化和改进!

  • 下一篇博客进行优化。实现Callable接口:V call() throws Exception 。可以返回结果,以及可以抛出异常。(启动线程比较麻烦,不能直接传给Thread()参数值)

目录

一、需求。

(1)要求使用多线程模拟龟兔赛跑。

(2)详细描述需要完成的工作。

二、分析。

(1)实现100米。

(2)模拟速度。

(3)兔子到达80米时。

(4)统计时间。

(5)判断输赢。

(6)本题实现多线程采用的方法。

(7)join()方法。

三、IDEA中实现代码。

(1)兔子类实现Runnable类。

(2)乌龟类实现Runnable类。

(3)测试类Test。

四、测试结果

(1)让兔子跑到80米时,睡觉5s。

(2)让兔子跑到80米时,睡觉10s。


一、需求。

(1)要求使用多线程模拟龟兔赛跑。
(2)详细描述需要完成的工作。
  • 兔子可能因睡觉时间长,乌龟赢得比赛。兔子也可能因睡觉时间短,乌龟输掉比赛。
  • 兔子、乌龟各跑100 米。
  • 兔子每100 毫秒跑2米,在80米处兔子睡觉: (睡觉时间自定义:如5s) (提示:Thread.sleep()
  • 乌龟每100 毫秒跑1米。乌龟不睡觉。(提示:Thread.sleep()

二、分析。

(1)实现100米。
  • 累加的思想。两个线程都是累加到100。
  • 谁累加到100后,用的时间较少,谁就赢了。
(2)模拟速度。
  • 因为是累加操作。所以每次for循环执行run()方法。
  • 兔子的速度。每跑完2米"睡一下",也就是睡100毫秒。(Thread.sleep()
  • 乌龟的速度。每跑完1米"睡一下",也就是睡100毫秒。
(3)兔子到达80米时。
  • 兔子线程累加达到80时,就指定兔子睡眠时间。
(4)统计时间。
  • 定义一个long类型的变量存储时间。
  • private私有属性。提供getter()方法。
  • 记录开始时间与结束时间。
(5)判断输赢。
  • 在测试类中,是main方法中执行代码。
  • 也就是要控制我们的main线程执行。它要等"兔子"与"乌龟"线程都执行完毕,主线程(main)才能根据双方用的时间来统计比赛结果。
  • join()方法。要用线程对象调用该方法。(Thread对象.join())。
(6)本题实现多线程采用的方法。
  • 其中乌龟、兔子实体类都实现java.lang.Runnable接口,重写run()方法。
  • 在测试类中各自创建一个Runnable对象。然后再通过创建"乌龟"、"兔子"线程。也就是new Thread(Runnable target)
  • 这里的"Runnable target"是传递创建好的"乌龟"与"兔子"的Runnable对象。然后创建的线程执行start()方法,若它抢到时间片,就执行Thread类的run()方法后。然后让该Runnable对象在内部的run()方法中调用本身的run()方法。
  • 最终启动并运行乌龟、兔子线程类。

  • 解释例子如下。
  • 但是启动线程代码复杂,它依赖Thread类,调用Thread类的start()。
  • 但是推荐用,因为线程类可以再去继承其他类,扩展性高
(7)join()方法。
  • 调用该方法时,就是最外面的线程要等该线程执行完毕后,才能执行完成。
  • 也就是兔子线程、乌龟线程都执行完成后,最外面的main线程才能计算最后的结果。
  • 当mian线程执行到这两行代码时,就会等待。

三、IDEA中实现代码。

代码中注释有详细解释

(1)兔子类实现Runnable类。
package com.fs;/*** @Title: RabbitThread* @Author HeYouLong* @Package com.fs* @Date 2024/10/10 下午10:08* @description: 兔子线程*/
public class RabbitThread implements Runnable{//记录兔子的总跑步时间private long time;//判断兔子是否跑完100米private static boolean flag=false;//私有属性获取public long getTime() {return time;}@Overridepublic void run() {//计时当前时间long start_time =System.currentTimeMillis();for (int i = 0; i <100 ; i+=2) {//兔子的速度:每过100毫秒累加2if(i==80){//兔子睡觉5stry {//如果想睡10s,则传参数.sleep(10000)System.out.println("兔子睡着了5秒...");Thread.sleep(5000);} catch (InterruptedException e) {throw new RuntimeException(e);}}try {Thread.sleep(100);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("兔子跑完"+i+"m");if(i==98){flag=true;}}if(flag){System.out.println("兔子跑完100m");}time=System.currentTimeMillis()-start_time;}
}
(2)乌龟类实现Runnable类。
package com.fs;/*** @Title: TortoiseThread* @Author HeYouLong* @Package com.fs* @Date 2024/10/10 下午10:08* @description: 乌龟线程*/
public class TortoiseThread implements Runnable {//记录乌龟的总跑步时间private long time;//判断乌龟是否跑完100米private static boolean flag=false;//私有属性获取public long getTime() {return time;}@Overridepublic void run() {//计时当前时间long start_time =System.currentTimeMillis();for (int i = 0; i <100 ; i++) {//兔子的速度:每过100毫秒累加1try {Thread.sleep(100);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("乌龟跑完"+i+"m");if(i==99){flag=true;}}if(flag){System.out.println("乌龟跑完100m");}time=System.currentTimeMillis()-start_time;}
}
(3)测试类Test。
package com.fs;/*** @Title: Test* @Author HeYouLong* @Package com.fs* @Date 2024/10/10 下午5:34* @description:*/
public class Test {public static void main(String[] args)throws InterruptedException{System.out.println("龟兔赛跑开始......");//分别创建实现Runnable接口实例对象//兔子RabbitThread rabbitThread = new RabbitThread();//乌龟TortoiseThread tortoiseThread = new TortoiseThread();/* 这个多线程的实现依赖Thread类具体的原理可以看博客了解,这是实现多线程的一种方法之一调用方法new Thread(Runnable target)通过创建的两个线程的start()方法去抢占cpu时间片,如果抢到,执行两个线程中的run()方法两个线程的run()方法中分别传入Runnable接口的实例(兔子、乌龟)*///创建乌龟、兔子线程//参数的值——>传入实现Runnable接口的实例对象Thread  rabbit = new Thread(rabbitThread);Thread  tortoise = new Thread(tortoiseThread);//抢时间片(start()方法)rabbit.start();tortoise.start();//主线程(main)等待兔子线程、乌龟线程执行完毕//Thread对象.join()。main方法已经向上抛出异常。rabbit.join();tortoise.join();//兔子、乌龟线程执行完毕后,再开始统计比赛结果if(rabbitThread.getTime()<tortoiseThread.getTime()){System.out.println("兔子赢得了比赛!");}else if(tortoiseThread.getTime()<rabbitThread.getTime()){System.out.println("乌龟赢得了比赛!");}else {System.out.println("平局...");}}
}

四、测试结果

(1)让兔子跑到80米时,睡觉5s。

兔子赢


(2)让兔子跑到80米时,睡觉10s。

乌龟赢


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1560426.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

JavaSE——集合2:List(Iterator迭代器、增强for、普通for循环遍历集合)

目录 一、List (一)List接口基本介绍 二、List接口的常用方法 三、List集合的三种遍历方式 四、小练习——使用冒泡排序遍历集合 一、List (一)List接口基本介绍 List接口是Collection接口的子接口 public interface List<E> extends Collection<E> List集…

Matlab实现海洋捕食者优化算法优化回声状态网络模型 (MPA-ESN)(附源码)

目录 1.内容介绍 2部分代码 3.实验结果 4.内容获取 1内容介绍 海洋捕食者优化算法&#xff08;Marine Predators Algorithm, MPA&#xff09;是一种基于海洋生物捕食行为的新型群体智能优化算法。MPA通过模拟海洋捕食者如鲨鱼、海豚等在寻找猎物时的追踪、包围和攻击行为&…

高质量SCI论文撰写及投稿丨论文选题、文献调研、实验设计、数据分析、论文结构及语言规范等----AI强大功能

科学研究的核心在于将复杂的思想和实验成果通过严谨的写作有效地传递给学术界和工业界。对于研究生、青年学者及科研人员&#xff0c;如何高效撰写和发表SCI论文&#xff0c;成为提升学术水平和科研成果的重要环节。系统掌握从选题到投稿的全过程&#xff0c;提高论文撰写效率与…

区块链积分系统:重塑支付安全与商业创新的未来

在当今社会&#xff0c;数字化浪潮席卷全球&#xff0c;支付安全与风险管理议题日益凸显。随着交易频次与规模的不断扩大&#xff0c;传统支付体系正面临前所未有的效率、合规性和安全挑战。 区块链技术&#xff0c;凭借其去中心化、高透明度以及数据不可篡改的特性&#xff0c…

React(一) 认识React、熟悉类组件、JSX书写规范、嵌入变量表达式、绑定属性

文章目录 一、初始React1. React的基本认识2. Hello案例2.1 三个依赖2.2 渲染页面2.3 hello案例完整代码 二、类组件1. 封装类组件2. 组件里的数据3. 组件里的函数 (重点)4. 案例练习(1) 展示电影列表 三、JSX语法1. 认识JSX2. JSX书写规范及注释3. JSX嵌入变量作为子元素4. JS…

Linux操作系统小项目——实现《进程池》

文章目录 前言&#xff1a;代码实现&#xff1a;原理讲解&#xff1a;细节处理&#xff1a; 前言&#xff1a; 在前面的学习中&#xff0c;我们简单的了解了下进程之间的通信方式&#xff0c;目前我们只能知道父子进程的通信是通过匿名管道的方式进行通信的&#xff0c;这是因…

【gRPC】4—gRPC与Netty

gRPC与Netty ⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记链接&#x1f449;https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ 如果可以&#xff0c;麻烦各位看官顺手点个star~&#x1f60a; &#x1f4d6;RPC专栏&#xff1a;https://…

力扣 前缀和

找子数组的个数了解前缀和的基础。 前缀和大致理解为到达某个位置&#xff0c;前面几个数的总和&#xff0c;即s[i1]s[i]a[i1]&#xff0c;可以通过一次循环获得。然后几个前缀和作差&#xff0c;即可得到某个位置到某个位置的和&#xff0c;根据map的键值对进行更新次数。 题…

opencv实战项目(三十一):基于同态滤波的图像亮度提升

文章目录 前言一、同态滤波二、算法实现 前言 在数字图像处理领域&#xff0c;图像亮度的调整是一项基本且至关重要的技术。它不仅关系到图像的视觉效果&#xff0c;而且在许多实际应用中&#xff0c;如医疗影像分析、卫星遥感监测、视频监控系统等&#xff0c;都扮演着关键角…

基于STM32 ARM+FPGA+AD的电能质量分析仪方案设计(一)硬件设计

电能质量分析系统硬件设计 3.1 电能质量分析系统设计要求 本系统实现对电能质量的高精度测量&#xff0c;根据国家相关电能质量分析仪器规定 标准以及对市场电能质量分析仪的分析&#xff0c;指定以下设计目标。 &#xff08; 1 &#xff09;电能质量参数测量精度&#xf…

欧科云链研究院深掘链上数据:洞察未来Web3的隐秘价值

目前链上数据正处于迈向下一个爆发的重要时刻。 随着Web3行业发展&#xff0c;公链数量呈现爆发式的增长&#xff0c;链上积聚的财富效应&#xff0c;特别是由行业热点话题引领的链上交互行为爆发式增长带来了巨量的链上数据&#xff0c;这些数据构筑了一个行为透明但与物理世…

【部署篇】Redis-01介绍‌

一、Redis介绍‌ 1、什么是Redis&#xff1f; ‌Redis&#xff0c;英文全称是Remote Dictionary Server&#xff08;远程字典服务&#xff09;&#xff0c;Redis是一个开源的、使用‌ANSI C语言编写的‌Key-Value存储系统&#xff0c;支持网络、可基于内存亦可持久化。‌ 它提…

leetcode hot100_part3_滑动窗口

滑动窗口是有一个基本的模版的&#xff0c;不要自己想当然哦~ 滑动窗口算法思想&#xff08;附经典例题&#xff09;_滑动窗口的思想-CSDN博客 滑动窗口也叫同向双指针&#xff1b;可以先看一下灵山视频&#xff1a;滑动窗口【基础算法精讲 03】_哔哩哔哩_bilibili 3.无重复字…

【unity进阶知识12】从零手搓unity存档存储数据持久化系统,实现对存档的创建,获取,保存,加载,删除,缓存,加密,支持多存档

文章目录 前言一、Unity对Json数据的操作方法一、JsonUtility方法二、Newtonsoft 二、持久化的数据路径三、数据加密/解密加密方法解密方法 四、条件编译指令限制仅在编辑器模式下进行加密/解密四、数据持久化管理器1、存档工具类2、一个存档数据3、存档系统数据类4、数据存档存…

【Oracle数据库进阶】001.SQL基础查询_查询语句

课 程 推 荐我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448;入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448;虚 拟 环 境 搭 建 &#xff1a;&#x1…

安卓使用.9图实现阴影效果box-shadow: 0 2px 6px 1px rgba(0,0,0,0.08);

1.安卓实现阴影效果有很多种&#xff0c;一般UX设计会给以H5参数box-shadow: 0 2px 6px 1px rgba(0,0,0,0.08);这种方式提供背景阴影效果&#xff0c;这里记录一下实现过程 2.界面xml源码 <?xml version"1.0" encoding"utf-8"?> <layout xmlns…

【SEO】什么是SEO?

什么是SEO&#xff08;搜索引擎优化&#xff09;&#xff1f;为什么SEO对于⼀个⽹站⾄关重要&#xff1f; SEO 全称是搜索引擎优化&#xff08;Search Engine Optimization&#xff09; 因为我们目前开发的网址&#xff0c;需要人看到&#xff0c;除了通过宣传营销的方式展现…

kubernetes中微服务部署

微服务 问&#xff1a;用控制器来完成集群的工作负载&#xff0c;那么应用如何暴漏出去&#xff1f; 答&#xff1a;需要通过微服务暴漏出去后才能被访问 Service 是一组提供相同服务的Pod对外开放的接口借助Service&#xff0c;应用可以实现服务发现和负载均衡Service 默认只…

Docker容器简介及部署方法

1.1 Docker简介 Docker之父Solomon Hykes&#xff1a;Docker就好比传统的货运集装箱 2008 年LXC(LinuX Contiainer)发布&#xff0c;但是没有行业标准&#xff0c;兼容性非常差 docker2013年首次发布&#xff0c;由Docker, Inc开发 1.1.1什么是Docker Docker是管理容器的引…

苹果秋季盛典:iPhone 16系列引领未来科技潮流

9月10日&#xff0c;苹果公司在众人瞩目中举办了2024年的秋季特别活动&#xff0c;发布了备受期待的iPhone 16系列。 尽管网络发布会已经持续了一整年&#xff0c;但熬夜观看的果粉们仍然热情不减&#xff0c;因为每一次苹果的新品发布都代表着科技界的一次重大飞跃。 iPhone …