Java 正在调用设置了*中断状态*的Thread.sleep()?

Java 正在调用设置了*中断状态*的Thread.sleep()?,java,multithreading,thread-safety,Java,Multithreading,Thread Safety,Java文档在这一点上并不清楚。如果在调用之前调用线程中断,会发生什么情况: 会被扔吗 请指向相关文档。InterruptedException文档似乎表明它可以在其他时间中断 当一个线程正在等待、睡眠或以其他方式暂停很长时间,而另一个线程使用thread类中的中断方法中断它时抛出 此外,由于它是一个已检查的异常,因此只能由声明它的方法抛出。看 ()您可以使用以下类来测试行为。在这种情况下,循环不会中断,线程在进入睡眠状态时死亡 公共类测试中断{ public static void main

Java文档在这一点上并不清楚。如果在调用之前调用线程中断,会发生什么情况:

会被扔吗


请指向相关文档。

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

当一个线程正在等待、睡眠或以其他方式暂停很长时间,而另一个线程使用thread类中的中断方法中断它时抛出

此外,由于它是一个已检查的异常,因此只能由声明它的方法抛出。看


()

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

公共类测试中断{

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

}
publicstaticvoidmain(String[]args)抛出InterruptedException{
线程t=新线程(){
公开募捐{
System.out.println(“你好”);
试一试{
对于(int i=0;i<1000000;i++){
系统输出打印(“.”);
}
睡眠(10000);
}捕捉(中断异常e){
系统输出打印项次(“中断”);
e、 printStackTrace();
}
}
};
t、 start();
睡眠(100);
System.out.println(“即将中断”);
t、 中断();
}

}一个线程可以在任何时间点中断,但在该线程使用
thread.currentThread().isInterrupted()
专门检查其中断状态之前,或者当它到达,或者已经被调用
thread.sleep(long)
Object.wait(long)阻止时,它不会产生任何效果
或其他抛出
中断异常的标准JDK方法,如
java.nio
包中的方法。当捕捉到
中断异常
或显式调用
thread.interrupted()
时,线程的中断状态将重置(有关该难以捉摸的方法,请参阅文档)


应该进一步解释线程中断如何工作以及如何正确处理它们。

是的,它将抛出异常。根据javadoc for,该方法:

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

在这种情况下,“has”是指中断状态的非正式方式。遗憾的是,它是非正式的——如果有什么地方规范应该是精确和明确的,那么,它无处不在,但最重要的是线程原语


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

我尝试了这个程序的一个变体,它抛出了InterruptedException,确认了Boffin和Tom的答案是正确的。是的。它抛出了一个异常,但问题是什么时候?在上述情况下,在调用sleep之前不会抛出异常。是的,您是对的。但这就是关键:如果中断发生在调用之前,sleep()会抛出异常吗?答案是:是的!“当捕捉到InterruptedException时,线程的中断状态被重置”-不完全是这样。根据javadoc,状态是在抛出异常时清除的,而不是在捕获异常时清除的。(这实际上意味着在
throw
语句之前……或者在本例中,是与
throw
相当的本机代码)是的,没错,但在捕获之前,您实际上无法检查它或执行任何其他操作。我想说“当你捕捉到一个
InterruptedException
时,线程的中断状态已经被重置了”这个答案完全忽略了最初的问题,不知道OP为什么会接受这个问题。问题是当中断标志已经设置时调用
Thread.sleep()
是否会导致方法抛出
InterruptedException
,这根本无法回答这个问题。我想你可以把马引向水边,但你不能强迫它喝水。我为OP提供了足够的信息来解答他自己的问题。如果你没有得到答案,答案是肯定的。@BoffinbraiN,有时候人们在这里问问题不是因为没有足够的信息,而是因为有太多的可用信息,以至于模糊了一个简单问题的实际答案。有时候,用太多的信息回答这样一个问题会导致信息过载,让人疑惑,“那么,如果回答的这一段应该包含答案,那么他们为什么不说是或不是?”因此,感谢您添加了一个实际的“是”的跟进,因为你彻底的回答还是有点不清楚。
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();

}