美文网首页
6. InterruptedException与interrup

6. InterruptedException与interrup

作者: 段段小胖砸 | 来源:发表于2021-08-24 19:40 被阅读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

    • 轻量级: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,并且线程被唤醒。而如果线程此时并没有被阻塞,则线程什么都不会做。但在后续,线程可以判断自己是否收到过其他线程发来的中断信号,然后做一些对应的处理。
    这两个方法都是线程用来判断自己是否收到过中断信号的,前者是实例方法,后者是静态方法。二
    者的区别在于,前者只是读取中断状态,不修改状态;后者不仅读取中断状态,还会重置中断标志位。

    相关文章

      网友评论

          本文标题:6. InterruptedException与interrup

          本文链接:https://www.haomeiwen.com/subject/kwpliltx.html