线程被中断后能否睡眠?中断标记置位后主线程能否执行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
相关产品推荐
相关产品推荐

