1 回答
![?](http://img1.sycdn.imooc.com/54584f8f00019fc002200220-100-100.jpg)
TA贡献1825条经验 获得超6个赞
您可以CompletionStage.thenCompose(Function)与结合使用CompletableFuture.allOf(CompletableFuture...)。由所Function使用的通用签名thenCompose为:Function<? super T, ? extends CompletionStage<U>>。
public CompletableFuture<Void> loadAndApply(SomeObject object) {
return loadData().thenCompose(data ->
CompletableFuture.allOf(
CompletableFuture.runAsync(() -> object.setA(processA(data)), swingExecutor),
CompletableFuture.runAsync(() -> object.setB(processB(data)), backgroundExecutor)
) // End of "allOf"
); // End of "thenCompose"
} // End of "loadAndApply"
这有一个额外的好处。在您当前正在使用的thenAcceptAsync阶段的代码中,必须等待thenApplyAsync阶段完成才能执行。当同时使用以上两者时setA,它们setB将在各自的执行程序中同时运行。
为了方便起见,以下是Javadoc allOf:
返回一个新的CompletableFuture,当所有给定的CompletableFutures完成时就完成。如果给定的CompletableFuture中的任何一个异常完成,则返回的CompletableFuture也会执行此操作,并且CompletionException会将此异常作为其原因。否则,给定CompletableFuture的结果(如果有)不会反映在返回的CompletableFuture中,而是可以通过单独检查来获得。如果未提供CompletableFuture,则返回一个CompletableFuture,其值为null。
在继续执行程序之前,此方法的应用程序是等待一组独立的CompletableFutures的完成,例如:CompletableFuture.allOf(c1,c2,c3).join();。
...以及Javadoc用于thenCompose:
返回一个新的CompletionStage,该值以与给定函数返回的CompletionStage相同的值完成。
当此阶段正常完成时,将使用该阶段的结果作为参数来调用给定函数,并返回另一个CompletionStage。当该阶段正常完成时,此方法返回的CompletionStage将使用相同的值完成。
为了确保进度,提供的功能必须安排其结果的最终完成。
此方法类似于Optional.flatMap和Stream.flatMap。
有关涵盖异常完成的规则,请参阅CompletionStage文档。
注意:CompletableFuture,它实现了CompletionStage,thenCompose但会覆盖,但使返回类型更具体(returnCompletableFuture而不是CompletionStage)。
添加回答
举报