摘抄自《Java并发编程的艺术》

中断可以理解为线程的一个标志位属性。它表示一个运行的线程是否被其他线程进行了中断操作。
中断操作就好比其他线程对该线程打了个招呼,其他线程通过调用该线程的interrupt()方法对其进行中断操作。

线程通过检查自身是否被中断来进行响应,线程通过方法isInterrupted()来进行判断是否被中断,也可以调用静态方法Thread.interrupted()对当前线程的中断标志位进行复原。

从Java的API中可以看到,许多声明抛出InterruptException的方法(例如Thread.sleep(long millis)方法)这些方法在抛出InterruptException之前,Java虚拟机会先将线程的中断标志位清除,然后抛出InterruptException,此时调用isInterrupted()方法将会返回false。

总结

  1. 如何实现线程中断?
    通过向对应的线程设置中断标志位,即调用interrupt()方法。
  2. 线程如何响应中断?
    通过一个不断检查中断标志位的代码来实现,如:
    public void run(){
     while(!isInterrupted()){
         //执行逻辑
     }
    }
  3. 声明中断异常的API函数内部实现是怎样的?
    这类方法一般都是native方法,即由Java虚拟机会先将线程的中断标志位清除,然后抛出InterruptException