阻塞方法与InterruptedException
什么是阻塞方法?为什么会抛出InterruptedException?
一般方法的完成只取决于它所要做的事情,以及是否有足够多可用的计算资源(CPU 周期和内存)。
而阻塞方法的完成还取决于一些外部的事件,例如计时器到期,I/O 完成,或者另一个线程的动作(释放一个锁,设置一个标志,或者将一个任务放在一个工作队列中)。
这就导致一个问题,阻塞方法等不到所等的事件就无法终止
因此令阻塞方法可取消就非常有用。例如:Thread.sleep()/thread.interrupt()
和 Object.wait()
/thread.interrupt()
支持的中断机制就是一种取消机制,当一个线程请求另一个线程停止它正在做的事情,便抛出 InterruptedException
线程中断后发生什么?
首先:每个线程都有一个与之相关联的 Boolean 属性,用于表示线程的中断状态,中断状态初始时为 false
当另一个线程通过调用 Thread.interrupt()
中断一个线程时,会出现以下两种情况之一:
1. 如果那个线程在执行一个低级可中断阻塞方法,例如 Thread.sleep()
、 Thread.join()
或 Object.wait()
,那么它将改变状态,取消阻塞并抛出InterruptedException
。
2. 其他情况, interrupt()
只是设置线程的中断状态。
那么对于第二种情况应该如何处理?
可以在被中断线程中运行的代码中轮询中断状态,看看它是否被请求停止正在做的事情。
中断状态可以通过 Thread.isInterrupted()
来读取,并且可以通过一个名为 Thread.interrupted()
的操作读取和清除。
因此,中断只是一种协作机制。当一个线程中断另一个线程时,被中断的线程不一定要立即停止正在做的事情。相反,中断是礼貌地请求另一个线程在它愿意并且方便的时候停止它正在做的事情。
有些方法,例如 Thread.sleep()
,会很认真地对待这样的请求,但每个方法不是一定要对中断作出响应。
简单来说,我要你中断,你答不答应,随便。。