Я играю с 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, я планирую выполнение кода, который ждет на защелке. Затем я отменяю будущее, ожидая, что прерванное исключение будет выбрано внутри. Но кажется, что поток остается заблокированным в ожидании вызова, и InterruptedException никогда не выбрасывается, даже если будущее отменяется (утверждения проходят). Эквивалентный код с использованием ExecutorService работает должным образом. Является ли это ошибкой в CompletableFuture или в моем примере?