“结庐在人境,而无车马喧”
在Java中,有3种方式来停止线程:
正常退出,就是当run()方法执行完毕;
使用stop()方法强行停止,但是这种方法在后来的Java版本中已经被弃用了,因为使用它可能会造成不可预知的结果;
使用interrupt()方法中断线程;
在这里,我们来看看第三种中断线程方法:
MyThread myThread = new MyThread();
myThread.start(); //启动线程
myThread.interrupt(); //中断线程
代码看起来很简单,直接使用MyThread.interrupt()即可;但是我们怎么知道线程有没有中断呢?
刚好Java提供了两个方法来判断线程是否已经被中断:interrupted()和isInterrupted;
这两个方法的使用也很简单,直接返回true或者false
System.out.println(myThread.interrupted());
System.out.println(myThread.isInterrupted());
那么这两个方法既然都能判断线程是否已经中断,它们两个有什么区别呢?
先来看看interrupted()方法在源码里是怎么描述的:
这里说的是,该方法用来测试当前线程是否被中断,并且再次调用该方法时,会返回false,因为此方法在调用一次后会清除它的终端状态;也就是下面测试的这种效果:
理论上这里应该输出两个true,但是这里却输出两个false.这又是为什么呢?
刚才在源码里也看到了,interrupted()这个方法中断的是当前线程,我这里测试的当前线程指的是main方法,然而我们调用中断方法的线程是MyThread,并不是main,所以实际上当前线程并没有被中断,所以这里返回两个false;
那我们来是这中断当前线程看是什么结果:
这里第一次返回了true,说明此时线程已经被中断了;第二次返回了false,是因为该方法会重置线程的中断状态;
再来看看isInterrupted方法:
说明这个方法不会重置线程的中断状态;测试一下:
返回了两个true,正好说明了中断的状态没有改变;
总结一下:
interrupted():用来判断当前线程的中断状态,并且在调用之后会清除线程的中断状态;
isInterrupted():判断线程Thread对象的中断状态,但是不会清除状态;