我知道一些Thread方法会清除中断标志(例如sleep,wait等)。 但他们为什么这样做呢?这是什么原因?
我知道一些Thread方法会清除中断标志(例如sleep,wait等)。 但他们为什么这样做呢?这是什么原因?
try {
while (!Thread.currentThread().isInterrupted()) {
Thread.sleep(5000);
// ... do stuff ...
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
由于异常被捕获在循环外部,因此线程停止循环,只有周围的代码是否设置了中断标志才有关系。但是,如果你在循环内部捕获InterruptedException,就像下面这样:
while (!Thread.currentThread().isInterrupted()) {
// ... do stuff ...
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
许多代码都这样做,因为程序员们被灌输过一定不要甚至想到使用异常来控制流程。如果是这样,那么你需要设置中断标志。
我认为意图是应用程序开发人员应该使用异常来跳出中断的上下文,将异常消耗在源头附近并不干净。