我写了一个人为的代码示例,它可能不是某人应该使用的代码,但我相信它应该有效.然而它反而陷入僵局.我已经阅读了这里描述的答案,但发现它们不足.
这是代码示例:
import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; import java.util.concurrent.Executors; public class Test { public static void main(String argv[]) throws Exception { int nThreads = 1; Executor executor = Executors.newFixedThreadPool( nThreads ); CompletableFuture.completedFuture(true) .thenComposeAsync((unused)->{ System.err.println("About to enqueue task"); CompletableFutureinnerFuture = new CompletableFuture<>(); executor.execute(() -> { // pretend this is some really expensive computation done asynchronously System.err.println("Inner task"); innerFuture.complete(true); }); System.err.println("Task enqueued"); return innerFuture; }, executor).get(); System.err.println("All done"); System.exit(0); } }
这打印:
即将入队任务
任务排队
然后它挂了.它已陷入僵局,因为执行程序只有一个线程,并且它正在等待innerFuture变为可兑换.为什么它的返回值"thenComposeAsync"块成为可兑换的,而不是返回仍然不完整的未来,并在执行释放它的线程?
这感觉完全不直观,javadocs并没有真正帮助.我是否从根本上误解了CompletionStages的工作原理?或者这是实施中的错误?