CompletableFuture, thenCompose 方法

St.*_*rio 5 java multithreading threadpool java-8 completable-future

我有一些误解的合同thenCompose(Function<? super T,? extends CompletionStage<U>> fn)。这是那里所说的:

返回一个新的CompletionStage,当这个阶段正常完成时,将这个阶段作为提供函数的参数执行。

该函数似乎接受 this 的结果CompletionStage,而不是它CompletionStage本身。那么他们是什么意思呢?

那么返回的 代表的任务CompletableFuture呢?

Runnable r;
ExecutorService es;
Function<Void, CompletableFuture<Void>>f;
//...
CompletableFuture.runAsync(r, es)
.thenCompose(f);
Run Code Online (Sandbox Code Playgroud)

这是否意味着,由CompletableFuture返回的任务thenComposeThreadPoolRunnable r?

Did*_*r L 3

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

\n\n
\n

返回一个新的 CompletionStage,当此阶段正常完成时,将使用此阶段的结果作为提供的 function 的参数来执行该阶段。[\xe2\x80\xa6]

\n
\n\n

(重点是我自己的)

\n\n

另外,在 Java 9 中,现在的表述是

\n\n
\n

返回一个新的 CompletionStage,该阶段已完成,其值与给定函数返回的 CompletionStage 相同。

\n\n

当此阶段正常完成时,将使用此阶段的结果作为参数来调用给定函数,并返回另一个 CompletionStage。当该阶段正常完成时,此方法返回的 CompletionStage 将以相同的值完成。[\xe2\x80\xa6]

\n
\n\n

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

\n\n

对于CompletableFuture,这在文档顶部指出:

\n\n
\n

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

\n
\n\n

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

\n\n
    \n
  1. 如果此阶段已经完成,则该函数立即应用于调用的线程thenCompose()
  2. \n
  3. 如果此阶段尚未完成,该函数将应用于完成此阶段的线程(如果错误请纠正我)。
  4. \n
\n\n

请注意,.a 中没有“任务” CompletableFuture。返回值所做的唯一“任务”CompletableFuture是将传递函数返回的结果与其自身绑定。您负责执行完成CompletableFuture函数返回的任务。

\n