Thread.Interrupt()不生效,isInterrupted判断通过后sleep仍抛InterruptedException
问题原因分析
- 核心原因是检查操作与sleep操作之间存在竞态条件:
if (!loadThread.isInterrupted())判定为真仅代表执行这行代码的瞬间线程未被中断,但从判断结束到Thread.sleep(500)实际执行的时间窗口内,完全可能有其他线程调用了该线程的interrupt()方法设置了中断标记,此时进入sleep后就会立刻触发InterruptedException。 - 额外注意:
isInterrupted()是Thread类的实例方法,调用时不会清除线程的中断标记,如果你后续还要继续处理中断逻辑,需要在catch块中手动重置中断状态或者做对应的业务终止处理。
修复方案
- 删掉多余的中断状态前置判断即可,
Thread.sleep()本身自带中断响应能力,前置判断不仅无法避免中断异常,反而会引入不必要的竞态问题,修改后代码参考如下:
try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); // 此处可补充业务中断后的处理逻辑,比如终止任务、重置中断标记等 }
内容的提问来源于stack exchange,提问作者Igorson
相关产品推荐
相关产品推荐

