thencombine用于合并两个独立完成的completablefuture结果,仅当二者均成功完成时执行bifunction合并逻辑,返回新completablefuture;默认在第二个future完成线程执行,异常时短路不调用合并函数。

thenCombine 用于把两个独立完成的 CompletableFuture 的结果合并成一个新结果,它会在两个任务都成功完成后触发,且只在**两者都完成且未抛异常**时执行合并逻辑。
基本用法:传入另一个 CompletableFuture 和 BiFunction
调用方是第一个 future(cf1),用 thenCombine(cf2, (r1, r2) -> {...}) 把它的结果 r1 和 cf2 的结果 r2 合并:
CompletableFuture<string> cf1 = CompletableFuture.supplyAsync(() -> "Hello"); CompletableFuture<string> cf2 = CompletableFuture.supplyAsync(() -> "World"); CompletableFuture<string> combined = cf1.thenCombine(cf2, (s1, s2) -> s1 + " " + s2); // 结果为 "Hello World" </string></string></string>
注意:cf2 会**自动被加入依赖链**,无需手动 await;thenCombine 返回的新 future 会等两者都就绪才开始执行合并函数。
执行线程由哪个 future 决定?
thenCombine 中的合并函数默认在**第二个 future(cf2)完成时所在线程**中执行(不是 cf1 完成的线程,也不是 fork-join common pool 的固定线程)。如果想控制线程,可用 thenCombineAsync:
-
thenCombineAsync(...):用 common pool 线程执行合并 -
thenCombineAsync(..., executor):指定线程池执行
异常和短路行为要注意
只要 cf1 或 cf2 中任意一个以异常结束,整个 thenCombine 返回的 future 就会以该异常完成,**不会调用合并函数**。例如:
CompletableFuture<integer> cf1 = CompletableFuture.failedFuture(new RuntimeException("fail1"));
CompletableFuture<string> cf2 = CompletableFuture.completedFuture("ok");
cf1.thenCombine(cf2, (i, s) -> s + i); // 不会执行,返回的 future 也是 failed
</string></integer>
如需容错,可在上游用 exceptionally 或 handle 预先兜底,让两个 future 都稳定完成。
和 thenCompose、thenAcceptBoth 的区别
-
thenCompose:把第一个 future 的结果作为参数,去创建并等待**一个新的 CompletableFuture**(链式扁平化) -
thenAcceptBoth:也等两个 future,但不返回新结果,只消费(void 操作) -
thenCombine:等两个 future,用它们的结果计算并返回一个新值(有返回值的二元合并)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











