如果执行以下代码,则会看到线程为interrupted
,但是,Thread.interrupted()
将返回false
public class Test {
public static void main(String args[]) {
Thread t = new Thread() {
public void run() {
try {
synchronized (this) {
wait();
}
} catch (Exception e) {
e.printStackTrace();
System.out.println(Thread.interrupted());
}
}
};
t.start();
t.interrupt();
for (;;) {
}
}
}
请帮助我理解为什么它是false
,而应该是true
答案 0 :(得分:4)
JavaDocs是一件很棒的事情...
投掷:
InterruptedException -如果有线程 在当前线程之前或同时中断当前线程 等候。在以下情况下,将清除当前线程的 中断状态 会抛出该异常 。
答案 1 :(得分:0)
当您调用conn.execution_options(isolation_level="AUTOCOMMIT").execute(query)
时,t.interrupt()
方法会抛出一个wait()
,是的,但这只是因为在内部它是通过调用InterruptedException
来定期检查中断的原因。 br />
如果您检查API的最后一种方法,则可以阅读:
public static boolean interrupted()
测试当前线程是否已被中断。 该方法清除了线程的中断状态。换句话说,如果要连续两次调用此方法,则第二个调用将返回Thread.interrupted()
(除非当前线程在第一个调用清除其中断状态之后且在第一个调用清除其中断状态之前被再次中断)。第二个电话已经检查过了。
这正是您正在发生的事情。
这就是为什么诸如this one from IBM DeveloperWorks之类的文章建议每次我们捕获false
时都重置中断标志,但不打算对中断本身做任何事情的原因:
当阻止方法检测到中断并抛出
InterruptedException
时,它将清除中断状态。如果捕获InterruptedException
但无法将其抛出,则应保留发生中断的证据,以便调用堆栈中更高级别的代码可以了解中断并在需要时对其进行响应。通过调用InterruptedException
“重新中断”当前线程来完成此任务。