如果线程已经被中断,Thread.sleep会抛出异常吗?

5

如果一个线程在未被阻塞时被中断(即没有抛出InterruptedException异常),那么当它尝试后续休眠时,该线程是否会抛出InterruptedException异常?

文档没有明确说明:

InterruptedException - 如果任何线程中断了当前线程,则抛出此异常。当抛出此异常时,当前线程的中断状态将被清除。

3个回答

8
是的,可以。
文档上可能没有明确说明这一点,但这很容易进行测试(例如,参见下面你自己的答案)并查看标准实现(HotSpot)。Thread.sleep会调用os:sleep,在启动睡眠进程之前检查中断,你可以在这里查看该过程(查找os:sleep)。
如果不是这种情况,中断将几乎无法使用。如果它们恰好在任何sleep()调用之外到达,它们将丢失,因为随后的sleep()调用将忽略它们。你甚至不能重新中断线程,因为它已经被中断了。

看看 @mafu 的答案作为例子。注意一下 OP 的名字 :) - Pshemo
嘿。虽然这并不会使它无效,但它确实让我省去了自己打那个测试的麻烦 :) - BeeOnRope
1
我并不是说这个答案不正确,只是让楼主把自己的回答看作是别人的回答有点奇怪。我可能会说类似于“正如你在你的回答中已经展示的那样”。但这是你的回答,没有压力 :) - Pshemo
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Erwin Bolwidt

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);
}

1
不需要那么复杂:Thread.currentThread().interrupt(); Thread.sleep(1);同样可以回答你的问题... - Holger
@Holger 确实。简单地中断主线程的想法似乎如此不寻常,以至于我没有想到 :) - mafu

-5

不。

文档还说:“如果此线程在调用Object类的wait()、wait(long)或wait(long, int)方法,或者调用此类的join()、join(long)、join(long, int)、sleep(long)或sleep(long, int)方法时被阻塞,则它的中断状态将被清除,并且它将接收到InterruptedException。”

这排除了您提到的情况。


1
那段文档来自于Thread.interrupt(),它只描述了在调用该函数时会发生什么。你需要查看Thread.sleep()来了解当设置了interrupted标志时它会做什么。Thread.sleep()说它会抛出“InterruptedException - 如果任何线程中断了当前线程。当抛出此异常时,当前线程的中断状态将被清除”,我认为这也包括设置了interrupted标志的情况。 - Kenster
这些是抛出中断的充分条件,但不是必要条件。你遗漏了文档的最后一部分:如果没有满足前面的条件,则将设置此线程的中断状态。在这种情况下,中断状态将导致_后续_对可中断方法的调用抛出中断(根据这些方法的文档 - 至少如果你读懂了其中的含义)。 - BeeOnRope

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接