思路
- 跑道,设置长度,设置标志位是否跑完
- 如果跑完,标志位反转,输出语句,结束run方法
run方法
public void run() {
while (!isOver){
for (int i = trackLength;i>=0; i--) {
if(i == 0){
this.isOver=true;
System.out.println("Winner is "+Thread.currentThread().getName());
}
}
}
}
main方法
public static void main(String[] args) {
Track track = new Track();
Thread rabbit=new Thread(track,"rabbit");
Thread turtle=new Thread(track,"turtle");
rabbit.start();;
turtle.start();
}
测试,没有问题。
众所周知,龟兔赛跑是乌龟赢了,那么该对兔子下黑手了(黑幕
sleep
首先,要针对兔子做动作
Thread.currentThread().getName().equals("rabbit")
其次,使用sleep方法,让兔子昏睡
Thread.sleep(2000);
完整代码
class Track implements Runnable{
private final int TRACKLENGTH=100;//常量,跑道长度
int trackLength=TRACKLENGTH;
boolean isOver=false;//设置标志位
@Override
public void run() {
while (!isOver){//标志位循环
for (int i = trackLength;i>=0; i--) {//开始比赛,长度开始逐渐变短
if(i == 0){//到0,跑到终点
this.isOver=true;//标志位反转,结束比赛
System.out.println("Winner is "+Thread.currentThread().getName());
//胜利者是(乌龟)
}else if(Thread.currentThread().getName().equals("rabbit")&&i%==35){
//针对兔子(下黑手)跑到35的时候去睡觉
try {
Thread.sleep(20000);//兔子昏睡20秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
public static void main(String[] args) {
Track track = new Track();
Thread rabbit=new Thread(track,"rabbit");
//创建线程兔子
Thread turtle=new Thread(track,"turtle");
//创建线程乌龟
rabbit.start();
turtle.start();
}
新问题:出现获胜者程序还在跑
因为兔子线程在等待,没有结束
解决办法:将兔子和乌龟设为守护线程,主线程等待500毫秒
原理:JVM不会等待守护进程跑完,主程序等待500毫秒,足够乌龟跑完
rabbit.setDaemon(true);
rabbit.start();
turtle.setDaemon(true);
turtle.start();
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}