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返回的任务thenCompose将ThreadPool与Runnable r?
这似乎是 JavaDoc 中的一个错误。其他方法例如thenApply使用以下公式:
\n\n\n返回一个新的 CompletionStage,当此阶段正常完成时,将使用此阶段的结果作为提供的 function 的参数来执行该阶段。[\xe2\x80\xa6]
\n
(重点是我自己的)
\n\n另外,在 Java 9 中,现在的表述是:
\n\n\n\n\n返回一个新的 CompletionStage,该阶段已完成,其值与给定函数返回的 CompletionStage 相同。
\n\n当此阶段正常完成时,将使用此阶段的结果作为参数来调用给定函数,并返回另一个 CompletionStage。当该阶段正常完成时,此方法返回的 CompletionStage 将以相同的值完成。[\xe2\x80\xa6]
\n
至于哪个线程/线程池将执行该函数,这实际上取决于实现。
\n\n对于CompletableFuture,这在文档顶部指出:
\n\n\n为非异步方法的依赖完成提供的操作可以由完成当前 CompletableFuture 的线程执行,也可以由完成方法的任何其他调用者执行。
\n
在实践中,似乎有两种可能的情况:
\n\nthenCompose();请注意,.a 中没有“任务” CompletableFuture。返回值所做的唯一“任务”CompletableFuture是将传递函数返回的结果与其自身绑定。您负责执行完成CompletableFuture函数返回的任务。