如何取消Java 8的CompletableFuture?
- 论坛
- 如何取消Java 8的CompletableFuture?
8 浏览
如何取消Java 8的CompletableFuture?
我正在使用Java 8的CompletableFuture进行编程。我有以下代码:
CountDownLatch waitLatch = new CountDownLatch(1); CompletableFuture> future = CompletableFuture.runAsync(() -> { try { System.out.println("等待"); waitLatch.await(); //取消应该中断 System.out.println("完成"); } catch (InterruptedException e) { System.out.println("被中断"); throw new RuntimeException(e); } }); sleep(10); //给它一些时间来启动(不太美观,但有效) future.cancel(true); System.out.println("调用取消"); assertTrue(future.isCancelled()); assertTrue(future.isDone()); sleep(100); //给它一些时间来完成
使用runAsync,我安排了一个在等待latch上的代码执行。接下来,我取消了future,期望会抛出InterruptedException。但是似乎线程仍然在await调用上阻塞,并且即使future被取消(断言通过),InterruptedException也没有被抛出。使用ExecutorService的等效代码按预期工作。这是CompletableFuture的一个bug还是我的示例有问题?