私は 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 または私の例のバグですか?