[英]Is this appropriate use of Thread.interrupt()?
只要线程没有被中断,我想要运行一段代码。 目前我正在做的是:
while(!Thread.interrupted()){
// .. some code
try {
Thread.sleep(4000);
} catch(InterruptedException ex){
break;
}
// .. some more code
}
我的问题是:这是一个好习惯吗? 是否适当使用interrupt
?
是的,我认为这是interrupt()
目的,所以它似乎是合法的用法。
从概念上讲,这是在正确的轨道上。 但是,有一些细节可以改进。
这是正确的,线程中断机制被用来告诉线程做其他事情,线程可以在它选择的时候响应它的喜好。 在这种情况下,从Thread.sleep()
捕获InterruptedException
并打破循环是完全合理的事情。 它通常比通常做的更好,也就是完全忽略异常。 (这通常是错误的。)
可能存在的问题是循环条件还会检查线程是否已被中断。 这可能是一个问题,取决于some code
和some more code
正在做什么。 根据检测到中断时执行的代码块,您的系统可能处于不同的状态。
除非循环的一次迭代运行很长时间(除了睡眠),否则通常只需要在循环中有一个中断点。 在这种情况下,如果线程在执行some code
处理时被InterruptedException
则在调用Thread.sleep()
时将立即生成InterruptedException
。 因此,您可以将循环条件更改为while (true)
并使catch块阻止循环。 (如果这样做,你还应该重新确认中断位;见下文。)
或者,如果您只想检查循环顶部的中断,则可以执行以下操作:
while (!Thread.interrupted()) {
// .. some code
try {
Thread.sleep(4000L);
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
}
// .. some more code
}
这样可以安排从循环中只有一个退出点,这可能使代码更容易推理。
注意,这里使用的技术是在捕获InterruptedException
之后重新确认线程上的中断位。 处理中断的一般规则是应该重新置位中断位,或者应该传播InterruptedException
。 如果两者都没有完成,那么调用代码可能会在后续的wait()
调用中被阻塞,而不知道它曾经被中断过。 这通常是一个错误。
好的做法是使用较新的更高级别的API,例如ExecutorService
。 您不应使用较低级别的API,例如线程或synchronize
或wait
/ notify
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.