You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

线程被中断后能否睡眠?中断标记置位后主线程能否执行wait?

线程中断相关问题解答

1. 线程被中断后能否进入睡眠状态?

答案是不能。当线程的中断标记被置位后,如果你调用Thread.sleep()、Object.wait()这类会抛出InterruptedException的方法,这些方法会立刻抛出异常,不会让线程进入睡眠或等待状态,同时还会清除线程的中断标记。

举个实际场景:假设线程A已经被其他线程调用了interrupt()方法,此时线程A的中断标记为true。当线程A执行Thread.sleep(1000)时,不会真的进入1秒的睡眠,而是直接抛出InterruptedException,中断标记也会被重置为false。

2. 中断标记置位时,主线程还能执行wait操作吗?

结合你给出的代码:

try { 
    executor.schedule(currentThread::interrupt,100, TimeUnit.MILLISECONDS); 
    completor.waitComplete(); 
    fail(); 
} catch (InterruptedException e) {}

如果定时中断在completor.waitComplete()里的wait()操作执行前就触发了,那么当线程走到wait()这一步时,不会执行等待操作,而是立刻抛出InterruptedException。

原因很明确:当线程的中断标记为true时,调用Object.wait()(不管是无参还是带超时的重载方法)会直接触发InterruptedException,同时清除中断标记,线程根本不会进入等待队列。也就是说,这种情况下你的wait()根本没机会生效,直接就进入catch块了,后面的fail()也不会执行。

补充一点:哪怕你的waitComplete()方法里的synchronized块获取锁需要一些时间,而中断刚好在获取锁之后、调用wait之前触发,结果也是一样的——只要调用wait时中断标记是置位的,就会立刻抛异常。

内容的提问来源于stack exchange,提问作者oneat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:23:41