我已经写了很多有关InterruptedException和中断线程的文章 。 简而言之,如果您没有Future.cancel()
调用Future.cancel()
那么Future
将终止待处理的get()
,但还将尝试中断基础线程。 这是一个非常重要的功能,可以更好地利用线程池。 我还写信总是比标准Future
更喜欢CompletableFuture
。 事实证明,功能更强大的Future
弟兄没有那么优雅地处理cancel()
。 考虑以下任务,我们稍后将在整个测试中使用以下任务:
class InterruptibleTask implements Runnable {
private final CountDownLatch started = new CountDownLatch(1)
private final CountDownLatch interrupted = new CountDownLatch(1)
@Override
void run() {
started.countDown()
try {
Thread.sleep(10_000)
} catch (InterruptedException ignored) {
interrupted.countDown()
}
}
void blockUntilStarted() {
started.await()
}
void blockUntilInterrupted() {
assert interrupted.await(1, TimeUnit.SECONDS)
}
}