上述是龟兔赛跑问题的整体框架
下面开始撸代码:
创建Animal大类:
package rabbitThread;
/*
* 3.龟兔赛跑问题
龟兔赛跑:2000米
要求:
(1)兔子每 0.1 秒 5 米的速度,每跑20米休息1秒;
(2)乌龟每 0.1 秒跑 2 米,不休息;
(3)其中一个跑到终点后另一个不跑了!
程序设计思路:
(1)创建一个Animal动物类,继承Thread,编写一个running抽象方法,重写run方法,把running方法在run方法里面调用。
(2)创建Rabbit兔子类和Tortoise乌龟类,继承动物类
(3)两个子类重写running方法
(4)本题的第3个要求涉及到线程回调。需要在动物类创建一个回调接口,创建一个回调对象。
*
*
*
*
* */
//创建Animal类
public abstract class Animal extends Thread{
public int length = 2000;
public abstract void running();
public void run() {
super.run();
while(length > 0) {
running();
}
}
//在需要回调数据的地方(两个子类需要),声明一个接口
public static interface Calltoback{
public void win();
}
//创建接口对象
public Calltoback calltoback;
}
创建Rabbit类:
package rabbitThread;
public class Rabbit extends Animal {
public Rabbit() {
setName("兔子");
}
@Override
public void running() {
// TODO Auto-generated method stub
//兔子速度
int dis = 5;
length -= dis;
System.out.println("兔子跑了" + dis + "米,距离终点还有" + length + "米");
if(length <= 0) {
length = 0;
System.out.println("rabbit get the winner!");
//给回调对象赋值
if(calltoback != null) {
calltoback.win();
}
}
try {
if((2000 - length) % 20 == 0) {
//每20米 休息一次,休息时间是1秒
sleep(1000);
}else {
//每0.1秒跑5米
sleep(100);
}
} catch (Exception e) {
// TODO: handle exception
}
}
}
创建Tortoise类:
package rabbitThread;
public class Tortoise extends Animal{
public Tortoise() {
setName("乌龟");
//Thread的方法,给线程赋予名字
}
//重写running方法,编写乌龟的奔跑操作
@Override
public void running() {
// TODO Auto-generated method stub
//乌龟的速度
int dis = 2;
length -= dis;
System.out.println("乌龟跑了" + dis + "米,距离中点还有" + length + "米。");
if(length <= 0) {
length = 0;
System.out.println("tortoise get the winner!");
if(calltoback != null) {
calltoback.win();
}
}
try {
sleep(100);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
创建LetOneStop类:
package rabbitThread;
import rabbitThread.Animal.Calltoback;
//创建让动物线程停止的类,这里要实现回调接口
public class LetOneStop implements Calltoback{
//动物对象
Animal an;
//获取动物对象,可以传入 乌龟或者兔子的实例
public LetOneStop(Animal an) {
this.an = an;
}
@SuppressWarnings("deprecation")
@Override
public void win() {
// TODO Auto-generated method stub
//线程停止
an.stop();
}
}
创建MainClass主函数:
package rabbitThread;
public class MainClass {
public static void main(String[] args) {
//实例化乌龟和兔子
Tortoise tortoise = new Tortoise();
Rabbit rabbit = new Rabbit();
//回调方法的使用,谁先调用calltoback方法,另一个就不跑了
LetOneStop letonestop1 = new LetOneStop(tortoise);
//让兔子里的回调方法存在乌龟对象的值,可以把乌龟stop
rabbit.calltoback = letonestop1;
LetOneStop letonestop2 = new LetOneStop(rabbit);
//让乌龟里的回调方法存在兔子对象的值,可以把兔子stop
tortoise.calltoback = letonestop2;
//开始跑
tortoise.start();
rabbit.start();
}
}