一只兔子和一直乌龟进行赛跑,看谁先跑到100步。
使用Thread.currentThread().isInterrupted()来判断当前线程是否被中断了。
线程安全退出的代码范例为:
//如果当前线程没有被中断,则执行下面代码,当然也可以判断其他已存在的线程。
if(!Thread.currentThread().isInterrupted()){
//自己可以使用Thread.currentThread().interrupt();方法来中断自己,当然也可以中断其他已存在的线程。
if(...){
Thread.currentThread().interrupt();
}
}
龟兔赛跑,首先在赛场起点分别放置一只兔子和一只乌龟(创建两个对象),然后一声令下,开始赛跑(调用start方法)。
1.刚开始跑时,兔子首先判断了一下自己还有没有比赛资格(中断判断),发现有,于是就休息了一下(休眠代码)。休息完毕,它起身观察公告板,看看有没有胜利者(判断winner是否为null),发现没有胜利者。然后它低头看了看自己的步数,看看自己有没有成为胜利者(判断自己是否为胜利者的代码),发现自己也不是胜利者。然后,它向前走了一步(输出步数的代码)。与此同时,乌龟也在干相同的事情,但和兔子不同的是,它中途并没有休息。
2.乌龟到达终点,首先判断了一下自己还有没有比赛资格,发现有。于是它又判断了一下有没有胜利者,发现没有。然后它又判断了一下自己是不是胜利者,这一看不要紧,发现自己是胜利者,于是赶紧通知裁判自己胜利了,裁判收到信息,在公告板上画上了乌龟的名字,乌龟高兴地退出赛场。此时的兔子还没有接收到这个消息,于是继续判断自己还有没有比赛资格,休息之后,查看了公告版,发现乌龟的名字已经画在了公告板上,兔子很沮丧地退出了赛场。
示例代码:
public class Race {
public static void main(String[] args) {
Animal animal = new Animal();
Thread tortoise = new Thread(animal,"乌龟");
Thread rabbit = new Thread(animal,"兔子");
tortoise.start();
rabbit.start();
}
}
class Animal implements Runnable{
private static String winner;
private static int maxStep = 100;
@Override
public void run() {
for (int i = 0; i <= maxStep; i++) {
if(!Thread.currentThread().isInterrupted()){
//是兔子,首先歇息一下再跑
if("兔子".equals(Thread.currentThread().getName())){
try {
Thread.sleep(0);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//判断有没有胜利者
if(winner != null){
Thread.currentThread().interrupt();
}
//判断该动物有没有可能到达终点
if(isAWinner(i)){
System.out.println("胜利者是"+winner);
Thread.currentThread().interrupt();
}
System.out.println(Thread.currentThread().getName()+"跑了"+i+"步");
}
}
}
private boolean isAWinner(int step) {
//判断步数
if(step == maxStep){
winner = Thread.currentThread().getName();
return true;
}
return false;
}
}