调用Thread.sleep()与*中断状态*设置?

时间:2011-04-14 21:13:00

标签: java multithreading thread-safety

Java文档在这一点上并不清楚。如果在调用{<3}}之前调用线程上的中断会发生什么:

        //interrupt reaches Thread here
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            return;
        }

Thread.sleep()会被抛出吗?

请指向相关文档。

4 个答案:

答案 0 :(得分:11)

是的,它会引发异常。根据{{​​3}}的javadoc,方法:

  

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

在这种情况下,'has'是一种指称中断状态的非正式方式。令人遗憾的是它是非正式的 - 如果某个地方的规范应该是精确和明确的,那么它无处不在,但它首先是线程原语。

中断状态机制一般工作的方式是,如果一个线程在不可中断的情况下收到中断(因为它正在运行),那么中断基本上是等到线程中断,此时它突然进入导致InterruptedException。这是该机制的一个例子。

答案 1 :(得分:7)

线程可以在任何时间点中断,但在该线程专门用Thread.currentThread().isInterrupted()到达检查其中断状态之前,它不会有任何影响,或者是通过调用Thread.sleep(long)Object.wait(long)或其他标准JDK方法已阻止,这些方法抛出InterruptedException,例如java.nio包中的InterruptedException。当您发现Thread.interrupted()或明确调用{{1}}时,会重置线程的中断状态(请参阅该难以捉摸的方法的文档)。

This JavaSpecialists article应该更多地解释线程中断如何工作以及如何正确处理它们。

答案 2 :(得分:3)

您可以使用以下类来测试行为。在这种情况下,循环不会中断,并且线程在进入休眠状态时会死亡。

公共类TestInterrupt {

public static void main(String[] args) throws InterruptedException {
    Thread t = new Thread(){
        public void run(){
            System.out.println("hello");
            try {
                for (int i = 0 ; i < 1000000; i++){
                    System.out.print(".");
                }
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                System.out.println("interrupted");
                e.printStackTrace();  
            }

        }
    };
    t.start();
    Thread.sleep(100);
    System.out.println("about to interrupt.");
    t.interrupt();

}

}

答案 3 :(得分:1)

InterruptedException的文档似乎表明它可以在其他时间被中断

http://download.oracle.com/javase/1.4.2/docs/api/java/lang/InterruptedException.html

  

当线程等待,休眠或以其他方式暂停很长一段时间时抛出,另一个线程使用Thread类中的中断方法中断它

此外,由于它是一个经过检查的异常,它只会被声明它的方法抛出。参见

http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Thread.html#interrupt()