如何取消Java 8的CompletableFuture?

8 浏览
0 Comments

如何取消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还是我的示例有问题?

0