系列文章目录
案例
编写龟兔赛跑多线程程序,设赛跑长度为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();
}
}
}
}
}
总结
要学会对构造器灵活使用以及对线程的深刻理解