【发布时间】:2010-03-26 13:52:42
【问题描述】:
如果线程在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 是否更常见?
(虽然我不是一个初学者,但我标记了这个“初学者”,因为这对我来说似乎是一个非常基本的问题,看着它。)
【问题讨论】:
-
既然你问的是意见问题(“为什么会这样?”),你可能应该创建这个社区维基。
-
@Jonathan:这不是意见问题。查看 API 文档,很明显这背后必须有一个基本原理,所以我的问题有一个正确的答案。我接受的那个听起来很合理(线程安全中断处理)。
标签: java multithreading