|
@@ -0,0 +1,38 @@
|
|
|
|
|
+package space.anyi;
|
|
|
|
|
+
|
|
|
|
|
+import java.util.concurrent.CompletableFuture;
|
|
|
|
|
+
|
|
|
|
|
+public class Cf03_ThenCombine {
|
|
|
|
|
+ public static void main(String[] args) throws Exception {
|
|
|
|
|
+ // 场景: 同时拉取"用户信息"和"订单信息",两个都拿到后再合并展示
|
|
|
|
|
+ CompletableFuture<String> userFuture = CompletableFuture.supplyAsync(() -> {
|
|
|
|
|
+ sleep(100);
|
|
|
|
|
+ return "用户:李雷";
|
|
|
|
|
+ });
|
|
|
|
|
+ CompletableFuture<String> orderFuture = CompletableFuture.supplyAsync(() -> {
|
|
|
|
|
+ sleep(200);
|
|
|
|
|
+ return "订单:O-10008";
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ // thenCombine: 等两个都完成,把两个结果合并,返回一个新结果
|
|
|
|
|
+ CompletableFuture<String> combined = userFuture.thenCombine(orderFuture,
|
|
|
|
|
+ (user, order) -> user + " | " + order);
|
|
|
|
|
+ System.out.println("thenCombine 合并结果: " + combined.join());
|
|
|
|
|
+
|
|
|
|
|
+ // thenAcceptBoth: 等两个都完成,消费两个结果,但无返回值
|
|
|
|
|
+ userFuture.thenAcceptBoth(orderFuture, (user, order) ->
|
|
|
|
|
+ System.out.println("thenAcceptBoth 同时拿到: " + user + " & " + order)).join();
|
|
|
|
|
+
|
|
|
|
|
+ // runAfterBoth: 等两个都完成,不关心结果,只等一个时间点
|
|
|
|
|
+ userFuture.runAfterBoth(orderFuture, () ->
|
|
|
|
|
+ System.out.println("runAfterBoth: 两路结果都就绪")).join();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private static void sleep(long ms) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ Thread.sleep(ms);
|
|
|
|
|
+ } catch (InterruptedException e) {
|
|
|
|
|
+ e.printStackTrace();
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|