什么时候到达这个捕获块?

时间:2014-01-06 20:14:12

标签: java exception

我出于各种不同的原因使用了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内部必须发生什么才能抛出异常?

5 个答案:

答案 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()方法无关。