美文网首页
java 线程中断和 InterruptedException

java 线程中断和 InterruptedException

作者: 懵逼猴 | 来源:发表于2019-11-22 16:19 被阅读0次

    中断代表线程状态,每个线程都关联了一个中断状态,是一个 true 或 false 的 boolean 值,初始值为 false。Java 中的中断和操作系统的中断还不一样,这里就按照状态来理解吧,不要和操作系统的中断联系在一起

    // Thread 类中的实例方法,持有线程实例引用即可检测线程中断状态
    public boolean isInterrupted() {}
    
    // Thread 中的静态方法,检测调用这个方法的线程是否已经中断
    // 注意:这个方法返回中断状态的同时,会将此线程的中断状态重置为 false
    // 所以,如果我们连续调用两次这个方法的话,第二次的返回值肯定就是 false 了
    public static boolean interrupted() {}
    
    // Thread 类中的实例方法,用于设置一个线程的中断状态为 true
    public void interrupt() {}
    

    中断在并发中是常用的手段,请大家一定好好掌握。可以将中断理解为线程的状态,它的特殊之处在于设置了中断状态为 true 后,这几个方法会感知到:wait(), wait(long), wait(long, int), join(), join(long), join(long, int), sleep(long), sleep(long, int)这些方法都有一个共同之处,方法签名上都有throws InterruptedException,这个就是用来响应中断状态修改的。
    如果线程阻塞在 InterruptibleChannel 类的 IO 操作中,那么这个 channel 会被关闭。
    如果线程阻塞在一个 Selector 中,那么 select 方法会立即返回。
    如果线程阻塞在以上3种情况中,那么当线程感知到中断状态后(此线程的 interrupt() 方法被调用),会将中断状态重新设置为 false,然后执行相应的操作(通常就是跳到 catch 异常处)。
    如果不是以上3种情况,那么,线程的 interrupt() 方法被调用,会将线程的中断状态设置为 true。
    当然,除了这几个方法,我知道的是 LockSupport 中的 park 方法也能自动感知到线程被中断,当然,它不会重置中断状态为 false。我们说了,只有上面的几种情况会在感知到中断后先重置中断状态为 false,然后再继续执行

    InterruptedException 概述

    它是一个特殊的异常,不是说 JVM 对其有特殊的处理,而是它的使用场景比较特殊。通常,我们可以看到,像 Object 中的 wait() 方法,ReentrantLock 中的 lockInterruptibly() 方法,Thread 中的 sleep() 方法等等,这些方法都带有 throws InterruptedException,我们通常称这些方法为阻塞方法(blocking method)。

    阻塞方法一个很明显的特征是,它们需要花费比较长的时间(不是绝对的,只是说明时间不可控),还有它们的方法结束返回往往依赖于外部条件,如 wait 方法依赖于其他线程的 notify,lock 方法依赖于其他线程的 unlock等等。

    当我们看到方法上带有 throws InterruptedException 时,我们就要知道,这个方法应该是阻塞方法,我们如果希望它能早点返回的话,我们往往可以通过中断来实现。

    相关文章

      网友评论

          本文标题:java 线程中断和 InterruptedException

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