一只兔子和一直乌龟进行赛跑,看谁先跑到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;
    }
}