我对thenCompose(Function<? super T,? extends CompletionStage<U>> fn)
的{{3}}有一些误解。这就是那里所说的:
返回一个新的
CompletionStage
,当此阶段完成时 通常,以此阶段作为所提供的参数执行 功能
似乎该函数接受此CompletionStage
的结果,而不接受CompletionStage
本身的结果。那么他们的意思是什么?
返回的CompletableFuture
表示的任务怎么办?
Runnable r;
ExecutorService es;
Function<Void, CompletableFuture<Void>>f;
//...
CompletableFuture.runAsync(r, es)
.thenCompose(f);
是否意味着,由CompletableFuture
返回的thenCompose
代表的任务将与ThreadPool
在同一Runnable r
中执行?
答案 0 :(得分:1)
这似乎是JavaDoc中的一个错误。其他方法如thenApply
使用以下公式:
返回一个新的CompletionStage,当此阶段完成时 通常,执行将此阶段的结果作为参数 提供的功能。 [...]
(强调是我自己的)
此外,在Java 9中,formulation is now:
返回一个新的CompletionStage,其完成时的值与之相同 给定函数返回的CompletionStage。
当这个阶段正常完成时,调用给定的函数 这个阶段的结果作为参数,返回另一个 CompletionStage。当那个阶段正常完成时, 完成此方法返回的CompletionStage与完成相同 值。 [...]
关于哪个线程/线程池将执行该函数,这实际上取决于实现。
对于CompletableFuture
,这在文档的顶部显示:
为非异步方法的依赖完成提供的操作可以由完成当前CompletableFuture的线程执行,也可以由完成方法的任何其他调用者执行。
在实践中,似乎有两种可能的情况:
thenCompose()
的线程; 请注意,没有&#34;任务&#34;在CompletableFuture
内。唯一的任务&#34;返回的CompletableFuture
所做的是绑定传递函数返回的结果与自身的结果。您负责执行将完成函数返回CompletableFuture
的任务。