我正在阅读Goetz 的 Java Concurrency In Practice,其中显示了此示例代码:
public final class Indexer implements Runnable {
private final BlockingQueue<File> queue;
public Indexer(BlockingQueue<File> queue) {
this.queue = queue;
}
@Override
public void run() {
try {
while (true) {
queue.take();
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
与描述:
恢复中断。有时您不能抛出 InterruptedException,例如当您的代码是 Runnable 的一部分时。在这些情况下,您必须捕获 InterruptedException 并通过在当前线程上调用中断来恢复中断状态,以便调用堆栈更高的代码可以看到发出了中断,如清单 5.10 所示。
在示例代码中,如果执行此代码,“调用堆栈上方的代码”将永远不会看到中断 - 还是我做错了推论?这里的线程在调用后就死了interrupt()
,对吗?
所以这interrupt()
可能有用的唯一方法是如果它在一个循环中,对吗?