编写线程任务类

编写测试类

然后运行

可以发现子线程没有被停止

查看cancel方法的源码后发现该方是使用interrupt()方法来中断线程执行的

我们来详细看一下这个方法

public void interrupt();

中断此线程。

如果此线程在调用Object类的wait() 、 wait(long)或wait(long, int)方法或join() 、 join(long) 、 join(long, int)方法时被阻塞、 sleep(long)或sleep(long, int) ,此类的方法,则其中断状态将被清除并收到InterruptedException 。

如果前面的条件都不成立,则此线程的中断状态将被设置。如果一个线程在在运行中被打断,打断标记会被置为true。

如果一个线程在在运行中被打断,打断标记会被置为true。

如果是打断因sleep wait join方法而被阻塞的线程,会将打断标记置为false

值得一提的是,java中并没有可以结束线程执行的方法,只能通过结束run方法来终止一个线程,interrupt()只是为这个线程设置中断标识

可以看到,出现上述情况是因为此线程在sleep时调用了这个方法,所以出现了InterruptedException,导致线程没有被停止。可以通过结束run方法来停止线程,在catch语句中添加break;来使run方法结束。

如果是正常中断,出现异常,则需要使用中断标识来判断是否结束run方法

1
2
3
4
5
while(true) {
    if(Thread.currentThread().isInterrupted()) {
        break;
    }
}