目录
一、CompletableFuture源码中两任务组合方法
- 一、CompletableFuture源码中两任务组合方法
- 二、runAfterBoth方法代码示例
- 三、thenAcceptBothAsync方法代码示例
- 四、thenCombine方法代码示例
-
CompletableFuture源码中两任务组合相关方法
-
runAfterBoth方法: 没有返回值,入参CompletionStage、action; 第一个异步任务.runAfterBoth(第二个异步任务,第三个异步任务)
-
代码示例
package com.xz.thread.day1; import lombok.SneakyThrows; import java.util.concurrent.*; /** * @description: 两任务组合(两个任务都执行) * runAfterBoth方法: 没有返回值,入参CompletionStage、action; * 第一个异步任务.runAfterBoth(第二个异步任务,第三个异步任务) * @author: xz * @create: 2022-08-23 */ public class Test11 { /** * 定义线程池 */ public static ExecutorService service = Executors.newFixedThreadPool(3); @SneakyThrows public static void main(String[] args) { System.out.println("main start ..."); CompletableFuture future1 = CompletableFuture.supplyAsync(() -> { System.out.println("开启异步任务1..."); int i = 10 / 1; return i; }, service); CompletableFuture future2 = CompletableFuture.supplyAsync(() -> { System.out.println("开启异步任务2..."); return "hello world!"; }, service); future1.runAfterBothAsync(future2, () -> { System.out.println("开启任务3...."); }, service); System.out.println("main end ..."); } }
-
输出结果
-
有上述输出结果可知,任务3是在任务1和任务2执行完成后,才执行的。
-
thenAcceptBothAsync方法: 可以获取两个任务的返回值;thenAcceptBoth可以感知任务1和任务2的返回值,但是thenAcceptBoth没有返回值。
-
代码示例
package com.xz.thread.day1; import lombok.SneakyThrows; import java.util.concurrent.*; /** * @description: 两任务组合(两个任务都执行) * thenAcceptBoth方法:可以获取两个任务的返回值。 * thenAcceptBoth可以感知任务1和任务2的返回值,但是thenAcceptBoth没有返回值。 * @author: xz * @create: 2022-08-23 */ public class Test12 { /** * 定义线程池 */ public static ExecutorService service = Executors.newFixedThreadPool(3); @SneakyThrows public static void main(String[] args) { System.out.println("main start ..."); CompletableFuture future1 = CompletableFuture.supplyAsync(() -> { System.out.println("开启异步任务1..."); int i = 10 / 1; return i; }, service); CompletableFuture future2 = CompletableFuture.supplyAsync(() -> { System.out.println("开启异步任务2..."); return "hello world!"; }, service); future1.thenAcceptBothAsync(future2, (res1, res2) -> { System.out.println("任务3 启动了.... 任务1的返回值:" + res1 + " 任务2的返回值:" + res2); }, service); //System.out.println("获取异步任务最终返回值:" + future.get()); System.out.println("main end ..."); } }
-
输出结果
-
有上述输出结果可知,任务3在任务1和任务2执行后执行了,并获取了任务1和任务2的返回值。
-
thenCombine方法: 可以获取两个任务的返回值,并可以将任务三结果返回。
-
代码示例
package com.xz.thread.day1; import lombok.SneakyThrows; import java.util.concurrent.*; /** * @description: 两任务组合(两个任务都执行) * thenCombine 可以获取两个任务的返回值,并可以将任务三结果返回。 * @author: xz * @create: 2022-08-23 */ public class Test13 { /** * 定义线程池 */ public static ExecutorService service = Executors.newFixedThreadPool(3); @SneakyThrows public static void main(String[] args) { System.out.println("main start ..."); CompletableFuture future1 = CompletableFuture.supplyAsync(() -> { System.out.println("开启异步任务1..."); int i = 10 / 1; return i; }, service); CompletableFuture future2 = CompletableFuture.supplyAsync(() -> { System.out.println("开启异步任务2..."); return "hello world!"; }, service); CompletableFuture stringCompletableFuture = future1.thenCombineAsync(future2, (res1, res2) -> { System.out.println("任务3 启动了.... 任务1的返回值:" + res1 + " 任务2的返回值:" + res2); return res1 + "-->" + res2; }, service); System.out.println("获取异步任务最终返回值:" + stringCompletableFuture.get()); System.out.println("main end ..."); } }
-
输出结果