目录
一、CompletableFuture源码中计算完成回调方法
- 一、CompletableFuture源码中计算完成回调方法
- 二、whenComplete方法代码示例
- 二、exceptionally方法代码示例
- 当第一个异步任务执行完成后,还需要做其他的事情。CompletableFuture提供了计算完成时回调方法等接口。方法如下:
-
whenCompleteAsync方法:是把whenCompleteAsync的任务继续提交给线程池来进行执行。意味着可能会使用其他线程执行(如果是使用相同的线程池,也可能会被同一个线程选中执行)。
-
代码示例
package com.xz.thread.day1; import lombok.SneakyThrows; import java.util.concurrent.*; /** * @description: 计算完成回调(第一个异步任务执行完成后,还需要做其他的事情) * whenCompleteAsync方法:是把whenCompleteAsync的任务继续提交给线程池来进行执行。 * 意味着可能会使用其他线程执行(如果是使用相同的线程池,也可能会被同一个线程选中执行)。 * @author: xz * @create: 2022-08-23 */ public class Test4 { /** * 定义线程池 */ public static ExecutorService service = Executors.newFixedThreadPool(3); @SneakyThrows public static void main(String[] args) { System.out.println("main start ..."); CompletableFuture future = CompletableFuture.supplyAsync(() -> { System.out.println("开启异步任务..."); int i = 10 % 2; return i; }, service).whenCompleteAsync((res, exc) -> { System.out.println("异步任务完成了,执行结果是:" + res + " 异常是:" + exc); }); System.out.println("获取异步任务返回值:" + future.get()); System.out.println("main end ..."); } }
-
输出结果
-
如果异步任务出现了异常,可以通过exc打印异常。代码示例:
package com.xz.thread.day1; import lombok.SneakyThrows; import java.util.concurrent.*; /** * @description: 异步任务出现了异常,可以通过exc打印异常 * @author: xz * @create: 2022-08-23 */ public class Test5 { /** * 定义线程池 */ public static ExecutorService service = Executors.newFixedThreadPool(3); @SneakyThrows public static void main(String[] args){ System.out.println("main start ..."); CompletableFuture future = CompletableFuture.supplyAsync(() -> { System.out.println("开启异步任务..."); int i = 10 % 2; if (i == 0) { throw new RuntimeException("远程服务调用失败"); } return i; }, service).whenCompleteAsync((res, exc) -> { System.out.println("异步任务完成了,执行结果是:" + res + " 异常是:" + exc); }); System.out.println("获取异步任务返回值:" + future.get()); System.out.println("main end ..."); } }
-
输出结果
-
exceptionally方法:当异步任务出现了异常,我们可以使用exceptionally进行异常处理。exceptionally 接口可以接收一个异常,返回异常处理结果。
-
代码示例
package com.xz.thread.day1; import lombok.SneakyThrows; import java.util.concurrent.*; /** * @description: 异步任务出现了异常,我们可以使用exceptionally方法进行异常处理 * @author: xz * @create: 2022-08-23 */ public class Test6 { /** * 定义线程池 */ public static ExecutorService service = Executors.newFixedThreadPool(3); @SneakyThrows public static void main(String[] args) { System.out.println("main start ..."); CompletableFuture future = CompletableFuture.supplyAsync(() -> { System.out.println("开启异步任务..."); int i = 10 % 2; if (i == 0) { throw new RuntimeException("远程服务调用失败"); } return i; }, service).whenCompleteAsync((res, exc) -> { System.out.println("异步任务完成了,执行结果是:" + res + " 异常是:" + exc); }).exceptionally(throwable -> { System.out.println("进入了异常处理,捕获了" + throwable.getMessage() + "异常"); return 0; }); System.out.println("获取异步任务返回值:" + future.get()); System.out.println("main end ..."); } }
-
输出结果
-
通过exceptionally可以捕获异步任务抛出来的异常信息,并对异常进行处理,并可以将处理结果返回。