为什么InterruptedExceptions清除线程的中断状态?

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循环外部是否更常见?

(虽然我不是一个初学者,但我标记了这个"初学者",因为对我来说这看起来像是一个非常基本的问题,看着它.)

Tho*_*nin 9

想法是应该处理一次中断.如果显式InterruptedException没有清除"中断"标志,则大多数捕获器InterruptedException必须明确地清除该标志.相反,你可以通过自我中断(Thread.currentThread().interrupt())来"清除"旗帜.Java的设计人员一直在寻找能够在大多数时间保存击键的语义(即你经常想要清除标志而不是设置它).

  • 我不同意正在发生的事情背后的逻辑,但他们确实应该更好地命名方法. (2认同)