前言:在多线程程序中,遇到需要等待多个异步线程执行之后的操作,可能会用到 CompletableFuture.allOf 或者 thenCombine ,那么他们的区别是什么
thenCombine
和 CompletableFuture.allOf
在某些方面有相似之处,但它们的作用和用法是不同的。
-
CompletableFuture.allOf
:allOf
是一个静态方法,它接受一个CompletableFuture
数组(或可变参数列表),并返回一个新的CompletableFuture<Void>
。- 这个返回的
CompletableFuture<Void>
会在所有传入的CompletableFuture
任务都完成时完成。 - 它通常用于等待多个
CompletableFuture
任务都完成,但不关心它们的结果。 - 你可以通过调用
join()
方法来阻塞当前线程,直到所有任务都完成,或者使用thenRun
方法来在所有任务完成后执行一些代码。
-
thenCombine
:thenCombine
是一个实例方法,它接受另一个CompletableFuture
和一个BiFunction
,并返回一个新的CompletableFuture
。- 这个新的
CompletableFuture
会在调用thenCombine
的CompletableFuture
和传入的CompletableFuture
都完成时完成。 - 它将两个
CompletableFuture
的结果作为输入传递给BiFunction
,并返回BiFunction
的结果作为新CompletableFuture
的结果。 thenCombine
用于当两个任务都完成时,将它们的结果组合起来。
因此,虽然 allOf
和 thenCombine
都涉及等待多个任务完成,但它们的主要区别在于:
allOf
用于等待多个任务完成,但不关心它们的结果。thenCombine
用于等待两个任务完成,并将它们的结果组合成一个新的结果。
示例:
CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> 1);
CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 2);
// 使用 allOf 等待两个任务完成
CompletableFuture<Void> allFutures = CompletableFuture.allOf(future1, future2);
allFutures.thenRun(() -> System.out.println("Both tasks completed using allOf"));
// 使用 thenCombine 组合两个任务的结果
CompletableFuture<Integer> combinedFuture = future1.thenCombine(future2, (result1, result2) -> result1 + result2);
combinedFuture.thenAccept(sum -> System.out.println("Sum of both tasks: " + sum));
在这个例子中,allOf
用于等待 future1
和 future2
都完成,但不关心它们的具体结果。而 thenCombine
用于等待这两个任务都完成,并将它们的结果相加。