6. InterruptedException与interrup

2021-08-24  本文已影响0人  段段小胖砸

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

如果一个线程myThread处于了阻塞状态(线程内部调用了sleep等),这时此线程执行myThread.interrupt(),抛出异常,且唤醒线程,并在结束线程前让程序员有足够的时间来处理中断请求。
因此thread.interrupt()的精确含义是“唤醒轻量级阻塞”,不是字面意思“中断一个线程”。

thread.isInterrupted()与Thread.interrupted()的区别

因为 Thread.interrupted()相当于给线程发送了一个唤醒的信号,所以如果线程此时恰好处于
WAITING或者TIMED_WAITING状态,就会抛出一个InterruptedException,并且线程被唤醒。而如果线程此时并没有被阻塞,则线程什么都不会做。但在后续,线程可以判断自己是否收到过其他线程发来的中断信号,然后做一些对应的处理。
这两个方法都是线程用来判断自己是否收到过中断信号的,前者是实例方法,后者是静态方法。二
者的区别在于,前者只是读取中断状态,不修改状态;后者不仅读取中断状态,还会重置中断标志位。

上一篇下一篇

猜你喜欢

热点阅读