Animal类
package com.imooc.chapter16test;
import java.util.Random;
public class Animal implements Runnable{
private final int RACE_DISTANCE = 100; //100米的赛跑距离
//使用共享标志(volatile 变量)通知其他线程结束
private static volatile boolean raceFinished = false;
private String name; //选手姓名
private final Random random = new Random();
private int distance; //每位选手初始跑的距离
//含参构造方法
public Animal(String name,int distance) {
this.name = name;
this.distance = distance;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//重写父类对象
@Override
public void run() {
while( distance < RACE_DISTANCE){
distance++;
System.out.printf("%s 跑了 %d 米%n", name,distance);
//检查是否比赛已经结束
if (distance >= RACE_DISTANCE){
synchronized (this){
if(!raceFinished){
//如果比赛已经结束但是共享标志还是false改为true,通知另一个线程结束
raceFinished = true;
System.out.println("--------比赛结束-------");
System.out.println("冠军是: " + name);
}
}
}
try {
Thread.sleep(random.nextInt(11));//每位选手休息1-10毫秒
//如果选手是兔子且跑了10米并且兔子尚未完赛
if (name.equals("兔子") && distance % 10 == 0 && distance < RACE_DISTANCE) {
System.out.printf("%s 跑了10米,休息200ms%n", name);
Thread.sleep(200);
}
}catch(InterruptedException e) {
e.printStackTrace();
}
}
}
}
实现类
package com.imooc.chapter16test;
import com.sun.org.glassfish.gmbal.AMXClient;
public class HareTortoiseTest {
public static void main(String[] args) throws InterruptedException {
//创建乌龟和兔子的实例对象
Animal hare = new Animal("兔子",0);
Animal tortoise = new Animal("乌龟",0);
//创建Thread实例对象,并把兔子和乌龟的子类对象传参
Thread thread1 = new Thread(hare);
Thread thread2 = new Thread(tortoise);
//启动线程
thread1.start();
thread2.start();
}
}
读了文档看到可以使用共享标志(volatile 变量)通知其他线程结束,但是代码输出兔子线程跑完了才会结束,还请彭彭老师指出代码中的缺陷,不胜感激!
输出结果
兔子 跑了 1 米
乌龟 跑了 1 米
兔子 跑了 2 米
兔子 跑了 3 米
乌龟 跑了 2 米
乌龟 跑了 3 米
兔子 跑了 4 米
乌龟 跑了 4 米
乌龟 跑了 5 米
兔子 跑了 5 米
兔子 跑了 6 米
乌龟 跑了 6 米
兔子 跑了 7 米
乌龟 跑了 7 米
兔子 跑了 8 米
乌龟 跑了 8 米
兔子 跑了 9 米
乌龟 跑了 9 米
兔子 跑了 10 米
乌龟 跑了 10 米
兔子 跑了10米,休息200ms
乌龟 跑了 11 米
乌龟 跑了 12 米
乌龟 跑了 13 米
乌龟 跑了 14 米
乌龟 跑了 15 米
乌龟 跑了 16 米
乌龟 跑了 17 米
乌龟 跑了 18 米
乌龟 跑了 19 米
乌龟 跑了 20 米
乌龟 跑了 21 米
乌龟 跑了 22 米
乌龟 跑了 23 米
乌龟 跑了 24 米
乌龟 跑了 25 米
乌龟 跑了 26 米
乌龟 跑了 27 米
乌龟 跑了 28 米
乌龟 跑了 29 米
乌龟 跑了 30 米
乌龟 跑了 31 米
乌龟 跑了 32 米
乌龟 跑了 33 米
乌龟 跑了 34 米
乌龟 跑了 35 米
乌龟 跑了 36 米
乌龟 跑了 37 米
乌龟 跑了 38 米
兔子 跑了 11 米
乌龟 跑了 39 米
兔子 跑了 12 米
乌龟 跑了 40 米
兔子 跑了 13 米
兔子 跑了 14 米
乌龟 跑了 41 米
兔子 跑了 15 米
乌龟 跑了 42 米
兔子 跑了 16 米
乌龟 跑了 43 米
乌龟 跑了 44 米
兔子 跑了 17 米
乌龟 跑了 45 米
乌龟 跑了 46 米
兔子 跑了 18 米
乌龟 跑了 47 米
乌龟 跑了 48 米
乌龟 跑了 49 米
兔子 跑了 19 米
乌龟 跑了 50 米
乌龟 跑了 51 米
兔子 跑了 20 米
兔子 跑了10米,休息200ms
乌龟 跑了 52 米
乌龟 跑了 53 米
乌龟 跑了 54 米
乌龟 跑了 55 米
乌龟 跑了 56 米
乌龟 跑了 57 米
乌龟 跑了 58 米
乌龟 跑了 59 米
乌龟 跑了 60 米
乌龟 跑了 61 米
乌龟 跑了 62 米
乌龟 跑了 63 米
乌龟 跑了 64 米
乌龟 跑了 65 米
乌龟 跑了 66 米
乌龟 跑了 67 米
乌龟 跑了 68 米
乌龟 跑了 69 米
乌龟 跑了 70 米
乌龟 跑了 71 米
乌龟 跑了 72 米
乌龟 跑了 73 米
乌龟 跑了 74 米
乌龟 跑了 75 米
乌龟 跑了 76 米
乌龟 跑了 77 米
乌龟 跑了 78 米
乌龟 跑了 79 米
乌龟 跑了 80 米
乌龟 跑了 81 米
乌龟 跑了 82 米
乌龟 跑了 83 米
乌龟 跑了 84 米
兔子 跑了 21 米
乌龟 跑了 85 米
乌龟 跑了 86 米
兔子 跑了 22 米
乌龟 跑了 87 米
兔子 跑了 23 米
兔子 跑了 24 米
乌龟 跑了 88 米
兔子 跑了 25 米
乌龟 跑了 89 米
乌龟 跑了 90 米
乌龟 跑了 91 米
乌龟 跑了 92 米
兔子 跑了 26 米
兔子 跑了 27 米
乌龟 跑了 93 米
乌龟 跑了 94 米
乌龟 跑了 95 米
兔子 跑了 28 米
兔子 跑了 29 米
乌龟 跑了 96 米
兔子 跑了 30 米
兔子 跑了10米,休息200ms
乌龟 跑了 97 米
乌龟 跑了 98 米
乌龟 跑了 99 米
乌龟 跑了 100 米
--------比赛结束-------
冠军是: 乌龟
兔子 跑了 31 米
兔子 跑了 32 米
兔子 跑了 33 米
兔子 跑了 34 米
兔子 跑了 35 米
兔子 跑了 36 米
兔子 跑了 37 米
兔子 跑了 38 米
兔子 跑了 39 米
兔子 跑了 40 米
兔子 跑了10米,休息200ms
兔子 跑了 41 米
兔子 跑了 42 米
兔子 跑了 43 米
兔子 跑了 44 米
兔子 跑了 45 米
兔子 跑了 46 米
兔子 跑了 47 米
兔子 跑了 48 米
兔子 跑了 49 米
兔子 跑了 50 米
兔子 跑了10米,休息200ms
兔子 跑了 51 米
兔子 跑了 52 米
兔子 跑了 53 米
兔子 跑了 54 米
兔子 跑了 55 米
兔子 跑了 56 米
兔子 跑了 57 米
兔子 跑了 58 米
兔子 跑了 59 米
兔子 跑了 60 米
兔子 跑了10米,休息200ms
兔子 跑了 61 米
兔子 跑了 62 米
兔子 跑了 63 米
兔子 跑了 64 米
兔子 跑了 65 米
兔子 跑了 66 米
兔子 跑了 67 米
兔子 跑了 68 米
兔子 跑了 69 米
兔子 跑了 70 米
兔子 跑了10米,休息200ms
兔子 跑了 71 米
兔子 跑了 72 米
兔子 跑了 73 米
兔子 跑了 74 米
兔子 跑了 75 米
兔子 跑了 76 米
兔子 跑了 77 米
兔子 跑了 78 米
兔子 跑了 79 米
兔子 跑了 80 米
兔子 跑了10米,休息200ms
兔子 跑了 81 米
兔子 跑了 82 米
兔子 跑了 83 米
兔子 跑了 84 米
兔子 跑了 85 米
兔子 跑了 86 米
兔子 跑了 87 米
兔子 跑了 88 米
兔子 跑了 89 米
兔子 跑了 90 米
兔子 跑了10米,休息200ms
兔子 跑了 91 米
兔子 跑了 92 米
兔子 跑了 93 米
兔子 跑了 94 米
兔子 跑了 95 米
兔子 跑了 96 米
兔子 跑了 97 米
兔子 跑了 98 米
兔子 跑了 99 米
兔子 跑了 100 米