若是线程t由于Object.wait, Thread.join和Thread.sleep三种方法之一处于WAITING状态,其余线程调用t.interrupt()方法时线程t将接收到一个中断异常(InterruptedException),从而提前地终结WAITING状态。java
interrupt()只是改变中断状态而已。interrupt()不会中断一个正在运行的线程。这一方法实际上完成的是,给处于WAITING状态的线程抛出一个中断信号,这样线程就得以退出WAITING的状态。测试
若是线程t没有处于WAITING状态,这时调用interrupt()将不起做用。spa
线程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状态中跳出来。3d
测试线程是否被终止,这一调用不改变线程的中断状态。code
为啥说【这一调用不改变线程的中断状态】?由于其最终调用对象
/** * 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() 方法并不清除中断标识位,故而【这一调用不改变线程的中断状态】。blog
测试当前线程(即正在执行这一命令的线程)是否被中断。这一调用会产生一个反作用——将当前线程的中断状态设置为false。队列
能够看到最终调用的是it
/** * 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。