Rol*_*and 13 java multithreading thread-safety
Java文档在这一点上并不清楚.如果在调用Thread.sleep()之前调用Thread上的中断会发生什么:
//interrupt reaches Thread here
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
return;
}
Run Code Online (Sandbox Code Playgroud)
是否会抛出InterruptedException?
请指向相关文档.
Tom*_*son 11
是的,它会抛出异常.根据Thread.sleep的javadoc ,方法:
抛出:InterruptedException - 如果有任何线程中断了当前线程.抛出此异常时,将清除当前线程的中断状态.
在这种情况下,'has'是指称中断状态的非正式方式.令人遗憾的是它是非正式的 - 如果某个地方的规范应该是精确和明确的,那么它无处不在,但它首先是线程原语.
中断状态机制一般工作的方式是,如果一个线程在不可中断的情况下收到中断(因为它正在运行),那么中断基本上是等到线程中断,此时它突然导致InterruptedException的.这是该机制的一个例子.
一个线程可以在任何时间点被中断,但它不会有任何影响,直到该线程具体检查其中断状态Thread.currentThread().isInterrupted()
或当它到达,或者是已经阻止通过向呼叫Thread.sleep(long)
,Object.wait(long)
或抛出其他标准JDK方法InterruptedException
例如作为java.nio
包中的那些.当您捕获InterruptedException
或明确调用时,线程的中断状态会被重置Thread.interrupted()
(请参阅该难以捉摸的方法的文档).
这篇JavaSpecialists文章应该更多地解释线程中断如何工作以及如何正确处理它们.
归档时间: |
|
查看次数: |
6135 次 |
最近记录: |