OngoingDC 2022-11-17 22:17 采纳率: 60%
浏览 11
已结题

java 对阻塞线程执行 interrupt 方法的一些问题

据我所知,对正在阻塞的线程,如 sleep 中的线程,执行 interrupt 方法,会使该线程抛出异常,但是中断标记依旧是 false。我使用如下代码进行了验证:

import static java.lang.Thread.sleep;

public class MainDemo {
    public static void main(String[] args) throws InterruptedException{
        Thread thread = new Thread(() -> {
            try {
                sleep(5000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        });
        thread.start();

        sleep(1000);
        System.out.println( "interrupt...");
        thread.interrupt();
        System.out.println("中断标记:" + thread.isInterrupted());
    }
}

执行结果见下图:

img

想知道这里为什么中断标记是 true,而不是 false,按理来说应该是 false,因为打断阻塞线程,会以抛出异常的方式来执行。

  • 写回答

2条回答 默认 最新

  • Huazie 全栈领域优质创作者 2022-11-18 10:10
    关注

    thread.interrupt() 这里可以理解为 子线程发出了中断请求,子线程中的sleep响应了中断,抛出了 InterruptedException,这个过程需要时间,所以你下面发出中断后立即调用 thread.isInterrupted(),此时 子线程 可能还没响应,或者响应了还没运行结束。
    参考如下:

    public class Demo {
        public static void main(String[] args) throws InterruptedException{
            Thread thread = new Thread(() -> {
                try {
                    sleep(5000);
                } catch (InterruptedException e) {
                    System.out.println("InterruptedException");
                    throw new RuntimeException(e);
                }
            });
            thread.start();
    
            sleep(1000);
            System.out.println("中断标记before:" + thread.isInterrupted());
            System.out.println( "start interrupt...");
            thread.interrupt();
            System.out.println( "end interrupt...");
            sleep(1000);
            System.out.println("中断标记after:" + thread.isInterrupted());
        }
    }
    

    img

    如有帮助,欢迎采纳哈!

    我的《Java并发编程学习笔记》 正在更新中,欢迎一起讨论交流

    在这里插入图片描述

    欢迎star支持下!!!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    1人已打赏
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月26日
  • 已采纳回答 11月18日
  • 创建了问题 11月17日

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度