给定一个在没有被阻塞的情况下被中断的线程(即没有抛出InterruptedException),该线程在以后尝试睡眠时是否会抛出InterruptedException?
documentation没有明确说明:
InterruptedException - 如果有任何线程中断了当前线程。抛出此异常时,将清除当前线程的中断状态。
答案 0 :(得分:7)
是的,确实如此。
关于这一点,文档可能并不十分清楚,但这很容易进行测试(例如,参见下面的答案),并查看规范(HotSpot)实现。 Thread.sleep会发送到os:sleep
,它会在启动睡眠过程之前检查中断,因为您可以看到here(查找os:sleep
)。
如果不是这种情况,中断或多或少都不可能使用。如果他们碰巧在任何sleep()
电话之外到达,他们将会丢失,因为后续的sleep()
电话会忽略它们。你甚至无法重新中断线程,因为它已经被中断了。
答案 1 :(得分:1)
虽然我发现没有文件声明这是强制性的,但我发现在我的系统(32位客户端VM 1.7)上,当设置了中断的平面时尝试睡眠抛出。测试代码:
static volatile boolean ready = false;
public static void main (final String... args) throws InterruptedException {
Thread t = new Thread () {
public void run () {
while (!ready) {
}
try {
Thread.sleep (1);
System.out.println ("Not thrown!");
}
catch (InterruptedException e) {
System.out.println ("Thrown!");
}
}
};
t.start ();
t.interrupt (); // remove this line to change the output
ready = true;
Thread.sleep (100);
}
答案 2 :(得分:-4)
没有
文档还说“如果此线程被阻止 [我的重点]在调用 wait(),等待(长),或等待(long,int) Object类的方法,或 join(),join(long),join(long,int),sleep(long),或的方法sleep(long,int),此类的方法,然后它的中断状态将被清除,它将收到InterruptedException。“
这不包括你提到的情况。