我出于各种不同的原因使用了Thread.sleep
,但我从未理解的一件事是在此try / catch块期间发生异常时:
try {
Thread.sleep(1000); // sleep for 1 second.
} catch (Exception x) {
fail("Failed due to an exception during Thread.sleep!");
x.printStackTrace();
}
在Thread.sleep
内实际点击例外的计算机中会发生什么?我最好的猜测是,系统时钟可能是一生一次的“跳过跳动”,如心跳,但这种情况多久发生一次......
所以从本质上讲,我的问题是:在执行Thread.sleep
时,#sleep
内部必须发生什么才能抛出异常?
答案 0 :(得分:8)
如果您查看JavaDoc Thread.sleep()
,您会看到可能发生的情况:
抛出:
IllegalArgumentException - 如果millis的值为负
InterruptedException - 如果有任何线程中断了当前线程。抛出此异常时,将清除当前线程的中断状态。
关于如何中断另一个线程的示例可能如下所示:
public class Foo {
public static void main(final String[] args) throws Exception {
Thread sleepThread = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
System.out.println("Interrupted!");
}
}
});
sleepThread.start();
Thread.sleep(500);
sleepThread.interrupt();
}
}
这将打印
中断!
答案 1 :(得分:3)
Thread
类定义interrupt method。当一个线程调用它(显然是从另一个线程)并且没有安全异常时,会抛出InterruptedException
。
目的是准确地(通常)中断睡眠。
答案 2 :(得分:1)
Thread.sleep(someValue)可以触发InterruptedException 有关处理此异常的更多信息,并且您可以找到here。
你可以在SO上找到很多有用的答案。这是一个例子: When does Java's Thread.sleep throw InterruptedException?
答案 3 :(得分:0)
发出线程中断时,例如,如果发送了一个信号以关闭JVM。
答案 4 :(得分:0)
当Thread被中断时(通常是从另一个Thread调用的interrupt()方法)而不是只是等待,Thread可以抛出InterruptedException
(你应该使用它而不是一般的Exception)。它与sleep()方法无关。