您当前的位置: 首页 > 

小志的博客

暂无认证

  • 0浏览

    0关注

    1217博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

CompletableFuture异步编排(计算完成回调代码示例)

小志的博客 发布时间:2022-08-23 22:11:12 ,浏览量:0

目录
    • 一、CompletableFuture源码中计算完成回调方法
    • 二、whenComplete方法代码示例
    • 二、exceptionally方法代码示例

一、CompletableFuture源码中计算完成回调方法
  • 当第一个异步任务执行完成后,还需要做其他的事情。CompletableFuture提供了计算完成时回调方法等接口。方法如下: 在这里插入图片描述在这里插入图片描述
二、whenComplete方法代码示例
  • 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进行异常处理。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可以捕获异步任务抛出来的异常信息,并对异常进行处理,并可以将处理结果返回。

关注
打赏
1661269038
查看更多评论
立即登录/注册

微信扫码登录

0.1084s