我正在玩Java 8完整的期貨。我有以下代碼:如何取消Java 8可以完成的未來?
CountDownLatch waitLatch = new CountDownLatch(1);
CompletableFuture<?> future = CompletableFuture.runAsync(() -> {
try {
System.out.println("Wait");
waitLatch.await(); //cancel should interrupt
System.out.println("Done");
} catch (InterruptedException e) {
System.out.println("Interrupted");
throw new RuntimeException(e);
}
});
sleep(10); //give it some time to start (ugly, but works)
future.cancel(true);
System.out.println("Cancel called");
assertTrue(future.isCancelled());
assertTrue(future.isDone());
sleep(100); //give it some time to finish
使用runAsync我安排等待鎖存器的代碼的執行。接下來,我取消了未來,期待一個被打斷的異常被拋入其中。但是看起來線程在await調用中仍然被阻塞,並且即使未來被取消(斷言通過),也不會拋出InterruptedException。使用ExecutorService的等效代碼按預期工作。它是CompletableFuture中的錯誤還是在我的例子中?
你可以用'Executors.newFixedThreadPool'和'Executors.newWorkStealingPool'重現問題嗎?如果比較兩種不同的執行者實施方式,比較期貨和可完成期貨的比較將會使問題更清晰。 – nosid
JavaDoc說cancel(true)取消了CancellationException,但你沒有捕獲它。 – edharned
@nosid你是對的,newWorkStealingPool顯然不支持取消 – Lukas