Java Thread的interrupt详解

一、概述:

  • 1、没有任何语言方面的需求一个被中断的线程应该终止。中断一个线程只是为了引起该线程的注意,被中断线程可以决定如何应对中断。

  • 2、Thread.interrupt()方法不会中断一个正在运行的线程。修改状态。

  • 3、如果线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int) 方法,或者该类的 join()、join(long)、join(long, int)、 sleep(long) 或 sleep(long, int) 方法过程中受阻,则其中断状态将被清除,它还将收到一个InterruptedException异常。这个时候,

  • 我们可以通过捕获InterruptedException异常来终止线程的执行,具体可以通过return等退出或改变共享变量的值使其退出。

  • 4、LockSupport.park而阻塞的话,能够响应中断请求(中断状态被设置成true),但是不会抛出InterruptedException 。

  • 5、synchronized在获锁的过程中是不能被中断的,意思是说如果产生了死锁,则不可能被中断(请参考后面的测试例子)。 与synchronized功能相似的reentrantLock.lock()方法也是一样,它也不可中断的,即如果发生死锁,那么reentrantLock.lock()方法 无法终止,如果调用时被阻塞,则它一直阻塞到它获取到锁为止。但是如果调用带超时的tryLock方法reentrantLock.tryLock(long timeout, TimeUnit unit), 那么如果线程在等待时被中断,将抛出一个InterruptedException异常,这是一个非常有用的特性,因为它允许程序打破死锁。你也可以 调用reentrantLock.lockInterruptibly()方法,它就相当于一个超时设为无限的tryLock方法。

  • 6、如果该线程在可中断的通道上的 I/O 操作中受阻,则该通道将被关闭,该线程的中断状态将被设置并且该线程将收到一个 ClosedByInterruptException。 这时候处理方法一样,只是捕获的异常不一样而已。

二、在java的线程Thread类中有三个方法interrupt

    1. public static boolean interrupted() 测试当前线程是否已经中断。线程的"中断状态"由该方法清除(把状态修改false)。换句话说,如果连续两次调用该方法,则第二次调用将返回 false。
    1. public boolean isInterrupted() 测试线程是否已经中断。线程的"中断状态"不受该方法的影响。
    1. public void interrupt() 中断线程。