我最近继承了一个几乎没有Thread安全性的大型Java应用程序.我目前正在努力的是让所有线程正确处理被中断而不是使用非常糟糕的Thread.stop().
问题的一部分是我不知道每个方法调用清除中断标志.
目前我知道以下将清除中断标志:
Thread.interrupted()
Thread.sleep(long)
Thread.join()
Thread.join(long)
Object.wait()
Object.wait(long)
Run Code Online (Sandbox Code Playgroud)
我还缺少什么?谢谢
如果一个线程被中断,而里面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循环外部是否更常见?
(虽然我不是一个初学者,但我标记了这个"初学者",因为对我来说这看起来像是一个非常基本的问题,看着它.)