我有非常复杂的方法,几乎没有循环和其他方法调用。我想让中断这种方法成为可能。我发现这样做的唯一解决方案是检查是否Thread.currentThread().isInterrupted()
。问题是我想在每个循环的每个迭代中以及在其他几个地方检查它。在这之后,代码看起来并不那么好。
所以真的有两个问题
1.有什么其他方法可以在线程中断时停止方法,而不是一遍又一遍地检查同一个标志?
2.在每个循环中只添加!Thread.currentThread().isInterrupted()
条件或使用下面的某个方法是否更好(主要是在性能方面)?
void checkIfInterrupted() {
if (Thread.interrupted()) {
throw new InterruptedException();
}
}
答案 0 :(得分:4)
首选方法是检查线程中每个循环的Thread.currentThread()。isInterrupted()。即Java Concurrency In Practice - Listening 7.5:
class PrimeProducer extends Thread {
private final BlockingQueue<BigInteger> queue;
PrimeProducer(BlockingQueue<BigInteger> queue) {
this.queue = queue;
}
public void run() {
try {
BigInteger p = BigInteger.ONE;
while (!Thread.currentThread().isInterrupted())
queue.put(p = p.nextProbablePrime());
} catch (InterruptedException consumed) {
/* Allow thread to exit */
}
}
public void cancel() { interrupt(); }
}
每次循环迭代中有两个点可能会中断 检测到:在阻塞放置调用中,并通过显式轮询 循环标题中的中断状态。明确的测试不是 因为阻塞放置调用,这里严格必要,但它使 PrimeProducer对中断更敏感,因为它会检查 在开始搜索a的冗长任务之前中断 素,而不是之后。调用可中断阻塞方法时 不足以提供所需的响应能力, 明确测试中断状态可能有所帮助。