Han*_*etz 17 java multithreading
如果一个线程被中断,而里面Object.wait()还是Thread.join(),它抛出一个InterruptedException,它重置线程的中断状态.例如,如果我在这里有一个这样的循环Runnable.run():
while (!this._workerThread.isInterrupted()) {
// do something
try {
synchronized (this) {
this.wait(this._waitPeriod);
}
} catch (InterruptedException e) {
if (!this._isStopping()) {
this._handleFault(e);
}
}
}
Run Code Online (Sandbox Code Playgroud)
线程将在调用后继续运行interrupt().这意味着我必须通过在循环条件中检查自己的停止标志,重新抛出异常或添加一个来明确地突破循环break.
现在,这不是一个问题,因为这种行为有很好的记录,并不妨碍我按照我想要的方式做任何事情.但是,我似乎并不理解它背后的概念:为什么抛出异常后线程不再被视为中断?如果您获得中断状态interrupted()而不是isInterrupted(),那么也会发生类似的行为,那么,线程也只会出现一次中断.
我在做什么不寻常的事吗?例如,捕获InterruptedException循环外部是否更常见?
(虽然我不是一个初学者,但我标记了这个"初学者",因为对我来说这看起来像是一个非常基本的问题,看着它.)
想法是应该处理一次中断.如果显式InterruptedException没有清除"中断"标志,则大多数捕获器InterruptedException必须明确地清除该标志.相反,你可以通过自我中断(Thread.currentThread().interrupt())来"清除"旗帜.Java的设计人员一直在寻找能够在大多数时间保存击键的语义(即你经常想要清除标志而不是设置它).
| 归档时间: |
|
| 查看次数: |
5739 次 |
| 最近记录: |