【发布时间】:2019-09-19 16:37:18
【问题描述】:
我想将Runnable 包装在CompletableFuture 中以进行异步计算,但可以控制计算何时开始和结束。我用CountDownLatch 创建了一个CompletableFuture 来阻止处理,但是下面的sn-p 会抛出一个错误:
CountDownLatch countDownLatch = new CountDownLatch(1);
CompletableFuture completableFuture = CompletableFuture.runAsync(() -> {
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Stop");
});
Thread.sleep(1000L);
System.out.println("Start");
completableFuture.get(1000L, TimeUnit.MILLISECONDS);
countDownLatch.countDown();
开始 线程“主”java.util.concurrent.TimeoutException 中的异常 在 java.util.concurrent.CompletableFuture.timedGet(CompletableFuture.java:1771) 在 java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1915) 在 Sandbox.main(Sandbox.java:23)
另一方面,当我在没有超时的情况下调用 get 时,它会冻结(仅打印 Start)。
我希望 CompletableFuture 中的可运行对象在调用 countDownLatch.countDown(); 时运行。
【问题讨论】:
-
completableFuture.get(1000L, TimeUnit.MILLISECONDS);- 你阻塞了 1000 毫秒,在你得到TimeoutException之后,主线程没有机会到达countDownLatch.countDown() -
@Eugene 继续阅读 - 没有超时
Stop也永远不会打印 -
当然不是——甚至没有达到该代码。在
countDownLatch.await();周围再添加两个Syso语句
标签: java multithreading concurrency java-8 completable-future