问题描述
|
关于这一点,Java文档尚不清楚。如果在调用Thread.sleep()之前在线程上调用中断会发生什么:
//interrupt reaches Thread here
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
return;
}
会抛出InterruptedException吗?
请指向相关文档。
解决方法
是的,它将引发异常。根据Thread.sleep的javadoc,该方法为:
抛出:
InterruptedException-如果任何线程中断了当前线程。引发此异常时,将清除当前线程的中断状态。
在这种情况下,“具有”是指中断状态的非正式方式。这是非正式的,这很可惜-如果某个地方的规范应该准确无误,那么,到处都是,但是最重要的是线程基元。
中断状态机制通常的工作方式是,如果某个线程在不可中断时(因为正在运行)而接收到中断,则该中断实际上要等到线程被中断为止,此时它突然引发了InterruptedException。这是该机制的一个例子。
,线程可以在任何时间点中断,但是直到该线程用
Thread.currentThread().isInterrupted()
或到达时专门检查其中断状态,或者已经被调用Thread.sleep(long)
,Object.wait(long)
或其他标准JDK阻塞后,它才有效。抛出InterruptedException
的方法,例如java.nio
包中的方法。当您抓到InterruptedException
或显式调用Thread.interrupted()
时,线程的中断状态将重置(请参阅该难懂方法的文档)。
此JavaSpecialists文章应进一步说明线程中断如何工作以及如何正确处理它们。
,您可以使用以下类测试行为。在这种情况下,循环不会中断,线程在进入睡眠状态时会死掉。
公共类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();
}
}
,InterruptedException的文档似乎暗示它可以在其他时间被中断
http://download.oracle.com/javase/1.4.2/docs/api/java/lang/InterruptedException.html
当某个线程长时间等待,休眠或暂停时抛出该异常,而另一个线程使用Thread类中的interrupt方法将其中断
同样,由于它是一个检查的异常,它只会由声明它的方法抛出。看到
http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Thread.html#interrupt()