理解线程中断
摘抄自《Java并发编程的艺术》
中断可以理解为线程的一个标志位属性。它表示一个运行的线程是否被其他线程进行了中断操作。
中断操作就好比其他线程对该线程打了个招呼,其他线程通过调用该线程的interrupt()方法对其进行中断操作。
线程通过检查自身是否被中断来进行响应,线程通过方法isInterrupted()
来进行判断是否被中断,也可以调用静态方法Thread.interrupted()
对当前线程的中断标志位进行复原。
从Java的API中可以看到,许多声明抛出InterruptException的方法(例如Thread.sleep(long millis)方法)这些方法在抛出InterruptException之前,Java虚拟机会先将线程的中断标志位清除,然后抛出InterruptException,此时调用isInterrupted()方法将会返回false。
总结
- 如何实现线程中断?
通过向对应的线程设置中断标志位,即调用interrupt()方法。 - 线程如何响应中断?
通过一个不断检查中断标志位的代码来实现,如:public void run(){ while(!isInterrupted()){ //执行逻辑 } }
- 声明中断异常的API函数内部实现是怎样的?
这类方法一般都是native方法,即由Java虚拟机会先将线程的中断标志位清除,然后抛出InterruptException