如果一个线程在未被阻塞时被中断(即没有抛出InterruptedException异常),那么当它尝试后续休眠时,该线程是否会抛出InterruptedException异常?
文档没有明确说明:
InterruptedException - 如果任何线程中断了当前线程,则抛出此异常。当抛出此异常时,当前线程的中断状态将被清除。
如果一个线程在未被阻塞时被中断(即没有抛出InterruptedException异常),那么当它尝试后续休眠时,该线程是否会抛出InterruptedException异常?
文档没有明确说明:
InterruptedException - 如果任何线程中断了当前线程,则抛出此异常。当抛出此异常时,当前线程的中断状态将被清除。
os:sleep
,在启动睡眠进程之前检查中断,你可以在这里查看该过程(查找os:sleep
)。sleep()
调用之外到达,它们将丢失,因为随后的sleep()
调用将忽略它们。你甚至不能重新中断线程,因为它已经被中断了。虽然我没有找到任何文件说明这是强制性的,但我发现在我的系统上(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);
}
Thread.currentThread().interrupt(); Thread.sleep(1);
同样可以回答你的问题... - Holger不。
文档还说:“如果此线程在调用Object类的wait()、wait(long)或wait(long, int)方法,或者调用此类的join()、join(long)、join(long, int)、sleep(long)或sleep(long, int)方法时被阻塞,则它的中断状态将被清除,并且它将接收到InterruptedException。”
这排除了您提到的情况。
Thread.interrupt()
,它只描述了在调用该函数时会发生什么。你需要查看Thread.sleep()
来了解当设置了interrupted
标志时它会做什么。Thread.sleep()
说它会抛出“InterruptedException - 如果任何线程中断了当前线程。当抛出此异常时,当前线程的中断状态将被清除”,我认为这也包括设置了interrupted
标志的情况。 - Kenster如果没有满足前面的条件,则将设置此线程的中断状态。
在这种情况下,中断状态将导致_后续_对可中断方法的调用抛出中断(根据这些方法的文档 - 至少如果你读懂了其中的含义)。 - BeeOnRope