CompletableFuture,然后是撰写方法

时间:2016-10-21 11:36:02

标签: java multithreading java-8 threadpool completable-future

我对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中执行?

1 个答案:

答案 0 :(得分:1)

这似乎是JavaDoc中的一个错误。其他方法如thenApply使用以下公式:

  

返回一个新的CompletionStage,当此阶段完成时   通常,执行将此阶段的结果作为参数   提供的功能。 [...]

(强调是我自己的)

此外,在Java 9中,formulation is now

  

返回一个新的CompletionStage,其完成时的值与之相同   给定函数返回的CompletionStage。

     

当这个阶段正常完成时,调用给定的函数   这个阶段的结果作为参数,返回另一个   CompletionStage。当那个阶段正常完成时,   完成此方法返回的CompletionStage与完成相同   值。 [...]

关于哪个线程/线程池将执行该函数,这实际上取决于实现。

对于CompletableFuture,这在文档的顶部显示:

  

非异步方法的依赖完成提供的操作可以由完成当前CompletableFuture的线程执行,也可以由完成方法的任何其他调用者执行。

在实践中,似乎有两种可能的情况:

  1. 如果此阶段已经完成,则该函数会立即应用于调用thenCompose()的线程;
  2. 如果此阶段尚未完成,则该函数将应用于完成此阶段的线程(如果错误,请更正我)。
  3. 请注意,没有&#34;任务&#34;在CompletableFuture内。唯一的任务&#34;返回的CompletableFuture所做的是绑定传递函数返回的结果与自身的结果。您负责执行将完成函数返回CompletableFuture的任务。