Преглед на файлове

add Cf03 demo:组合任务(thenCombine/thenAcceptBoth/runAfterBoth)

yangyi преди 1 седмица
родител
ревизия
f1cf0ad1b5
променени са 1 файла, в които са добавени 38 реда и са изтрити 0 реда
  1. 38 0
      src/main/java/space/anyi/Cf03_ThenCombine.java

+ 38 - 0
src/main/java/space/anyi/Cf03_ThenCombine.java

@@ -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();
+        }
+    }
+}