Java线程调用interrupt()后isInterrupted()返回false问题排查
问题原因分析
第一个测试代码返回全false的原因
- 当
Thread.sleep()响应中断抛出InterruptedException时,JVM会自动清空线程的中断标志位,这就是catch块里打印isInterrupted()得到false的直接原因。 - 你在主线程调用
someThread.interrupt()之后又sleep了1秒,此时someThread的run方法已经执行完毕,线程进入终止状态。JVM规范明确规定,对于已经终止的线程,调用isInterrupted()永远返回false,和之前的中断状态无关。 - 另外
After start():那行输出本身就应该为false,因为你是打印完该行后才调用的interrupt()方法,此时标志位还未被设置。
第二个测试代码返回全false的原因
你在子线程的run方法里调用Thread.currentThread().interrupt()之后,run方法就执行完成了,子线程直接终止。主线程等待1秒后去查询已经终止的线程的中断状态,自然只能拿到false。
如果要验证中断标志确实被设置过,可以在子线程调用interrupt()之后、run方法结束前加一行打印isInterrupted()的代码,你会看到这一行输出为true,修改示例如下:
@Override public void run() { System.out.println("From thread-run(): " + Thread.currentThread().isInterrupted()); Thread.currentThread().interrupt(); // 线程未终止时查询,会输出true System.out.println("After self interrupt: " + Thread.currentThread().isInterrupted()); }
核心认知补充
你之前的认知有两处遗漏:
- 所有会抛出
InterruptedException的方法(sleep、wait、join等),在抛出异常的同时都会自动清空中断标志位,不需要用户手动操作。 - 只有处于存活状态(RUNNABLE、BLOCKED、WAITING、TIMED_WAITING)的线程,
isInterrupted()才会返回当前真实的中断标志值,线程一旦终止,该方法固定返回false。
内容的提问来源于stack exchange,提问作者hhrzc
相关产品推荐
相关产品推荐

