如果在调用
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);
}
}
}
在调用 interrupt()
后,线程将继续运行。这意味着我必须在循环条件中检查自己的停止标志、重新抛出异常或添加 break
来明确地跳出循环。
现在,这并不是一个问题,因为这种行为已经被充分记录,也不会阻止我按照自己的方式进行操作。然而,我似乎不理解它背后的概念:为什么一旦抛出异常,线程就不再被认为是中断状态?如果你使用 interrupted()
而不是 isInterrupted()
来获取中断状态,也会出现类似的情况,线程只会在第一次出现中断。
我在这里做了什么不寻常的事情吗?例如,捕获 InterruptedException
是否更常见于循环外部?
(尽管我不完全是初学者,但我将其打上了“初学者”的标签,因为对我来说,这似乎是一个非常基本的问题。)