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

时间:2014-05-17 10:07:28

标签: java multithreading sleep interrupted-exception

给定一个在没有被阻塞的情况下被中断的线程(即没有抛出InterruptedException),该线程在以后尝试睡眠时是否会抛出InterruptedException?

documentation没有明确说明:

  

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

3 个答案:

答案 0 :(得分:7)

是的,确实如此。

关于这一点,文档可能并不十分清楚,但这很容易进行测试(例如,参见下面的答案),并查看规范(HotSpot)实现。 Thread.sleep会发送到os:sleep,它会在启动睡眠过程之前检查中断,因为您可以看到here(查找os:sleep)。

如果不是这种情况,中断或多或少都不可能使用。如果他们碰巧在任何sleep()电话之外到达,他们将会丢失,因为后续的sleep()电话会忽略它们。你甚至无法重新中断线程,因为它已经被中断了。

答案 1 :(得分: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);
}

答案 2 :(得分:-4)

没有

文档还说“如果此线程被阻止 [我的重点]在调用 wait(),等待(长),等待(long,int) Object类的方法,或 join(),join(long),join(long,int),sleep(long),的方法sleep(long,int),此类的方法,然后它的中断状态将被清除,它将收到InterruptedException。“

这不包括你提到的情况。