Java 如果线程已被中断,Thread.sleep是否抛出?

Java 如果线程已被中断,Thread.sleep是否抛出?,java,multithreading,sleep,interrupted-exception,Java,Multithreading,Sleep,Interrupted Exception,给定一个线程在未被阻塞时被中断(即未抛出InterruptedException),该线程在稍后尝试睡眠时是否会抛出InterruptedException 政府没有明确说明这一点: InterruptedException-如果任何线程中断了当前线程。引发此异常时,当前线程的中断状态将被清除 没有 文档中还说,“如果在调用对象类的wait()、wait(long)或wait(long,int)方法,或者调用join()、join(long)、join(long,int)、sleep(long)

给定一个线程在未被阻塞时被中断(即未抛出InterruptedException),该线程在稍后尝试睡眠时是否会抛出InterruptedException

政府没有明确说明这一点:

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

没有

文档中还说,“如果在调用对象类的wait()、wait(long)或wait(long,int)方法,或者调用join()、join(long)、join(long,int)、sleep(long)或sleep(long,int)方法时阻塞了这个线程,则其中断状态将被清除,并将接收到InterruptedException。“


这不包括您提到的情况。

虽然我没有发现说明这是强制性的文档,但我发现在我的系统(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);
}
是的

文档在这一点上可能并不十分清晰,但这很容易测试(例如,请参见下面的your own答案),也很容易查看规范(HotSpot)实现。Thread.sleep跳转到
os:sleep
,在启动睡眠进程之前检查中断,如您所见(查找
os:sleep


如果不是这样的话,中断或多或少是不可能使用的。如果它们恰好到达任何
sleep()
调用之外,它们将丢失,因为后续
sleep()
调用将忽略它们。您甚至无法重新中断线程,因为它已经被中断。

这部分文档来自
thread.interrupt()
,它只描述调用该函数时发生的情况。您必须查看
Thread.sleep()
以查看设置
interrupted
标志时它会做什么
Thread.sleep()
表示它会抛出“InterruptedException-如果有线程中断了当前线程。抛出此异常时,当前线程的中断状态将被清除”,我会解释为包括设置了
interrupted
标志的情况。这些就足够了,但不是抛出中断的必要条件。您省略了文档的最后一部分:
如果前面的条件都不成立,那么将设置此线程的中断状态。
在这种情况下,中断状态将导致对可中断方法的后续调用抛出中断(根据这些方法的文档-至少如果您在行之间读取).
查看@mafu的答案,例如
查看OP name:)呵呵。但这并没有降低它的有效性,也让我避免了自己打那个测试:)我并不是说它不那么有效,只是让OP看看他/她自己的答案,就像别人的答案一样,这有点奇怪。我可能会说一些类似于您在答案中所示的
。但是这就是你的答案,没有压力:)公平地说,
sleep
的Javadoc声明(如Q中所述):“如果任何线程中断了[…]”,而不是“当任何线程中断了[…]”,因此可以很好地说明,在调用sleep方法之前,它确实需要在线程处于中断状态时抛出。最后一段中的参数是+1。不需要把它弄得那么复杂:
Thread.currentThread().interrupt();睡眠(1)也会回答你的问题…@Holger确实如此。简单地中断主线的想法似乎太不寻常了,我没有想到:)