00017.04线程练习:龟兔赛跑案例

系列文章目录

案例

编写龟兔赛跑多线程程序,设赛跑长度为30米,兔子的速度是10米每秒,兔子每跑完10米休眠的时间10秒,乌龟的速度是1米每秒,乌龟每跑完10米的休眠时间是1秒,要求,每跑1米,显示一下结果:xxx跑了几米, 休息时,显示一下:xxx在休息…

一、需求

实现案例上的需求

在这里插入图片描述
在这里插入图片描述
兔子要休息
在这里插入图片描述
乌龟也是一样的
他们的代码如下:

package com.atguigu.test05;

/*编写龟兔赛跑多线程程序,设赛跑长度为30米,
兔子的速度是10米每秒,兔子每跑完10米休眠的时间10秒,
乌龟的速度是1米每秒,乌龟每跑完10米的休眠时间是1秒,
要求,每跑1米,显示一下结果:xxx跑了几米,  休息时,显示一下:xxx在休息...*/
public class Test05G_TU {
	public static void main(String[] args) {
		TuZi tuZiThread=new TuZi();
		tuZiThread.start();
		
		WuGui wuGuiThread=new WuGui();
		wuGuiThread.start();
	}
}
class TuZi extends Thread{
	public void run(){
		for(int i=1;i<=30;i++){
			System.out.println("兔子跑了"+i+"米");
			try {
				Thread.sleep(100);//模拟跑1米的时间(兔子的速度是10米每秒)
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			if (i==10||i==20) {
				System.out.println("兔子在休息……");
				try {
					Thread.sleep(10000);//休息10秒
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}
class WuGui extends Thread{
	public void run(){
		for(int i=1;i<=30;i++){
			System.out.println("乌龟跑了"+i+"米");
			try {
				Thread.sleep(1000);//模拟跑1米的时间(乌龟的速度是1米每秒)
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			if (i==10||i==20) {
				System.out.println("乌龟在休息……");
				try {
					Thread.sleep(1000);//休息1秒
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}
``
运行效果如下
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201012130109179.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNzUzMzQw,size_16,color_FFFFFF,t_70#pic_center)
我们仔细看代码发现里面其实很多重复性的代码,怎么去把它优化

# 二、需求:这2个类怎么变成1个类
由于目前来看冗余代码较多,怎么优化
**先把原来的代码复制到另外一个新建类里面去,然后乌龟那个类删掉,只留兔子即可**
然后
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020101307504752.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNzUzMzQw,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201013112451523.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNzUzMzQw,size_16,color_FFFFFF,t_70#pic_center)
然后怎么做呢?我们给它加构造器
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201013112736938.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNzUzMzQw,size_16,color_FFFFFF,t_70#pic_center)

![ ](https://img-blog.csdnimg.cn/20201013112757916.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNzUzMzQw,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201013112959743.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNzUzMzQw,size_16,color_FFFFFF,t_70#pic_center)
然后在new就行了

![在这里插入图片描述](https://img-blog.csdnimg.cn/20201013113347705.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNzUzMzQw,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020101311345659.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNzUzMzQw,size_16,color_FFFFFF,t_70#pic_center)
完整代码如下:

```java
package com.atguigu.test06;
//--优化
/*编写龟兔赛跑多线程程序,设赛跑长度为30米,
兔子的速度是10米每秒,兔子每跑完10米休眠的时间10秒,
乌龟的速度是1米每秒,乌龟每跑完10米的休眠时间是1秒,
要求,每跑1米,显示一下结果:xxx跑了几米,  休息时,显示一下:xxx在休息...*/
public class Test06G_TU2 {
	public static void main(String[] args) {
		TuZi tuZiThread=new TuZi("兔子",30,100,10000);
		TuZi WuguiThread=new TuZi("乌龟",30,1000,1000);
		tuZiThread.start();
		WuguiThread.start();
	}
}
class TuZi extends Thread{
	private int distance;//距离
	private long millsaPerMeter;模拟跑1米的时间(兔子的速度是10米每秒)
	private long restPerTenMeter;	//每10米休息时间秒
	
	public TuZi(String name, int distance, long millsaPerMeter, long restPerTenMeter) {
		super(name);
		this.distance = distance;
		this.millsaPerMeter = millsaPerMeter;
		this.restPerTenMeter = restPerTenMeter;
	}



	public void run(){
		for(int i=1;i<=distance;i++){
			System.out.println(getName()+"跑了"+i+"米");
			try {
				Thread.sleep(millsaPerMeter);//模拟跑1米的时间(兔子的速度是10米每秒)
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			if (i==10||i==20) {
				System.out.println(getName() +"在休息……");
				try {
					Thread.sleep(restPerTenMeter);//休息n秒
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}

总结

要学会对构造器灵活使用以及对线程的深刻理解

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值