void interrupt()--调用native方法 private native void interrupt0()
如果线程t因为Object.wait, Thread.join和Thread.sleep三种方法之一处于WAITING状态,其他线程调用t.interrupt()方法时线程t将接收到一个中断异常(InterruptedException),从而提早地终结WAITING状态。
interrupt()只是改变中断状态而已。interrupt()不会中断一个正在运行的线程。这一方法实际上完成的是,给处于WAITING状态的线程抛出一个中断信号,这样线程就得以退出WAITING的状态。
如果线程t没有处于WAITING状态,这时调用interrupt()将不起作用。
线程t在执行t.sleep或者调用其他对象的wait或者其他线程的join方法时,线程tt调用线程t的interrupt方法,的确这一个时候t会有InterruptedException 异常抛出来。但这其实是线程t不断循环检查自身的中断标识位而自己抛出的InterruptedException。如果线程t正在执行一些指定的操作时如赋值,for,while,if,调用方法等,都不会去检查中断状态,所以线程t不会抛出 InterruptedException,而会一直执行着自己的操作。当线程t终于执行t.sleep或者调用其他对象的wait或者其他线程的join方法时,才马上会抛出 InterruptedException。若线程t没有执行t.sleep或者调用其他对象的wait或者其他线程的join方法,即没有在线程里自己检查中断状态自己抛出InterruptedException的话,那InterruptedException是不会被抛出来的。
以wait方法为例。线程t进入了对象a的等待队列。此时线程t会不断循环检测自己的中断标识位,如果发现中断状态被置位(设置为true)了。那么线程t要做的就是抛出InterruptedException异常,并从被WAITING状态中跳出来。
boolean isInterrupted() --调用native方法private native boolean isInterrupted(boolean ClearInterrupted);
测试线程是否被终止,这一调用不改变线程的中断状态。
为啥说【这一调用不改变线程的中断状态】?因为其最终调用
/**
* Tests if some Thread has been interrupted. The interrupted state
* is reset or not based on the value of ClearInterrupted that is
* passed.
*/
private native boolean isInterrupted(boolean ClearInterrupted);
方法。参数 ClearInterrupted 表示是否清除中断标识位。而isInterrupted()方法中调用时ClearInterrupted 为false,即不清除中断标识位。所以说 isInterrupted() 方法并不清除中断标识位,故而【这一调用不改变线程的中断状态】。
static boolean interrupted()--调用native方法private native boolean isInterrupted(boolean ClearInterrupted);
测试当前线程(即正在执行这一命令的线程)是否被中断。这一调用会产生一个副作用——将当前线程的中断状态设置为false。
可以看到最终调用的是
/**
* Tests if some Thread has been interrupted. The interrupted state
* is reset or not based on the value of ClearInterrupted that is
* passed.
*/
private native boolean isInterrupted(boolean ClearInterrupted);
方法。参数 ClearInterrupted 表示是否清除中断标识位。static boolean interrupted()调用时ClearInterrupted 设置为true,即要清除中断标识位,那么调用后就将中断标识位清除了,就是把中断标识位又设置为了false。