1.什么情况下会抛出Interrupted异常?
运行中的线程调用myThread.interrupt()
只有那些声明了会抛出InterruptedException的函数才会抛出异常,也就是下面这些常用的函数:
public static native void sleep(long millis) throws InterruptedException {...}
public final void wait() throws InterruptedException {...}
public final void join() throws InterruptedException {...}
2.轻量级阻塞与重量级阻塞
能够被中断的阻塞称为轻量级阻塞,对应的线程状态是WAITING或者TIMED_WAITING;而像
synchronized 这种不能被中断的阻塞称为重量级阻塞,对应的状态是 BLOCKED
- 轻量级:wait、join、park、sleep
- 重量级:synchronized
线程的六种状态:NEW、RUNNABLE、WAITING、TUNED_WAITING、BLOCKED、TERMINATED
如果一个线程myThread处于了阻塞状态(线程内部调用了sleep等),这时此线程执行myThread.interrupt(),抛出异常,且唤醒线程,并在结束线程前让程序员有足够的时间来处理中断请求。
因此thread.interrupt()的精确含义是“唤醒轻量级阻塞”,不是字面意思“中断一个线程”。
thread.isInterrupted()与Thread.interrupted()的区别
因为 Thread.interrupted()相当于给线程发送了一个唤醒的信号,所以如果线程此时恰好处于
WAITING或者TIMED_WAITING状态,就会抛出一个InterruptedException,并且线程被唤醒。而如果线程此时并没有被阻塞,则线程什么都不会做。但在后续,线程可以判断自己是否收到过其他线程发来的中断信号,然后做一些对应的处理。
这两个方法都是线程用来判断自己是否收到过中断信号的,前者是实例方法,后者是静态方法。二
者的区别在于,前者只是读取中断状态,不修改状态;后者不仅读取中断状态,还会重置中断标志位。
网友评论