1 回答

TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超6個(gè)贊
您可以CompletionStage.thenCompose(Function)與結(jié)合使用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"
這有一個(gè)額外的好處。在您當(dāng)前正在使用的thenAcceptAsync階段的代碼中,必須等待thenApplyAsync階段完成才能執(zhí)行。當(dāng)同時(shí)使用以上兩者時(shí)setA,它們setB將在各自的執(zhí)行程序中同時(shí)運(yùn)行。
為了方便起見,以下是Javadoc allOf:
返回一個(gè)新的CompletableFuture,當(dāng)所有給定的CompletableFutures完成時(shí)就完成。如果給定的CompletableFuture中的任何一個(gè)異常完成,則返回的CompletableFuture也會(huì)執(zhí)行此操作,并且CompletionException會(huì)將此異常作為其原因。否則,給定CompletableFuture的結(jié)果(如果有)不會(huì)反映在返回的CompletableFuture中,而是可以通過單獨(dú)檢查來獲得。如果未提供CompletableFuture,則返回一個(gè)CompletableFuture,其值為null。
在繼續(xù)執(zhí)行程序之前,此方法的應(yīng)用程序是等待一組獨(dú)立的CompletableFutures的完成,例如:CompletableFuture.allOf(c1,c2,c3).join();。
...以及Javadoc用于thenCompose:
返回一個(gè)新的CompletionStage,該值以與給定函數(shù)返回的CompletionStage相同的值完成。
當(dāng)此階段正常完成時(shí),將使用該階段的結(jié)果作為參數(shù)來調(diào)用給定函數(shù),并返回另一個(gè)CompletionStage。當(dāng)該階段正常完成時(shí),此方法返回的CompletionStage將使用相同的值完成。
為了確保進(jìn)度,提供的功能必須安排其結(jié)果的最終完成。
此方法類似于Optional.flatMap和Stream.flatMap。
有關(guān)涵蓋異常完成的規(guī)則,請(qǐng)參閱CompletionStage文檔。
注意:CompletableFuture,它實(shí)現(xiàn)了CompletionStage,thenCompose但會(huì)覆蓋,但使返回類型更具體(returnCompletableFuture而不是CompletionStage)。
添加回答
舉報(bào)