为什么中断异常会清除线程的中断状态?

2024-03-03

如果线程在内部被中断Object.wait() or Thread.join(),它抛出一个InterruptedException, 重置线程的中断状态。即,如果我在 a 中有一个这样的循环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循环外?

(尽管我不完全是初学者,但我给这个贴上了“初学者”的标签,因为这对我来说似乎是一个非常基本的问题,看着它。)


这个想法是中断应该被处理一次。如果明确InterruptedException没有清除“中断”标志然后大多数捕手InterruptedException必须明确清除该标志。相反,您可以通过自我中断来“清除”该标志(Thread.currentThread().interrupt())。 Java 的设计者所追求的语义可以在大多数情况下节省击键次数(即,您通常希望清除标志而不是保持其设置)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么中断异常会清除线程的中断状态? 的相关文章

随机推荐