Java 异步线程监听与结果回调及异常捕获总结分析

 更新时间:2021年11月02日 15:35:01   作者:剑客阿良_ALiang  
异常是程序之中导致程序中断的一种指令流,异常一旦出现并且没有进行合理处理的话,那么程序就将中断执行,这篇文章综合介绍了异步线程监听与结果回调及异常捕获

前言

工作中是否遇到这样的场景?

1、需要异步线程执行,而且需要获取到线程执行返回的结果。

2、如果执行过程异常,可以按照自定义方式消费异常信息。

如果只是单纯的使用Callable可以实现,本文提供更加优雅的工具类。

Maven依赖

        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.7.15</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>31.0.1-jre</version>
        </dependency>

代码

不废话,上代码。

package com.huyi.csdn.tools;
 
import cn.hutool.core.thread.ThreadUtil;
import com.google.common.util.concurrent.*;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.springframework.scheduling.concurrent.CustomizableThreadFactory;
 
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
 
/**
 * @Program: csdn @ClassName: AsyncListenUtil @Author: huyi @Date: 2021-10-30 11:48 @Description:
 * 异步线程监听回调工具 @Version: V1.0
 */
public class AsyncListenUtil {
  public static final ExecutorService executorService =
      Executors.newFixedThreadPool(10, new CustomizableThreadFactory("LISTEN-"));
  public static final ListeningExecutorService listeningExecutorService =
      MoreExecutors.listeningDecorator(executorService);
 
  /**
   * 提交任务
   *
   * @param work Callable需要线程执行的内容
   * @param consumer 结果消费
   * @param errorConsumer 异常消费
   * @param <T> 泛型
   */
  public static <T> void submit(
      Callable<T> work, Consumer<T> consumer, Consumer<Throwable> errorConsumer) {
    ListenableFuture<T> listenableFuture = listeningExecutorService.submit(work);
    Futures.addCallback(
        listenableFuture,
        new FutureCallback<T>() {
          @Override
          public void onSuccess(@Nullable T s) {
            consumer.accept(s);
          }
 
          @Override
          public void onFailure(Throwable throwable) {
            errorConsumer.accept(throwable);
          }
        },
        listeningExecutorService);
  }
 
  /** 摧毁线程池 */
  public static void destroy() {
    System.out.println("摧毁线程池");
    executorService.shutdown();
  }
 
  public static void main(String[] args) {
    AsyncListenUtil.submit(
        () -> {
          // todo 需要执行的内容
          ThreadUtil.sleep(10, TimeUnit.SECONDS);
          return "I finished my work";
        },
        result -> {
          // todo 结果处理
          System.out.println("listen get :" + result);
        },
        throwable -> {
          // todo 异常处理
          System.out.println(throwable.getMessage());
        });
    ThreadUtil.sleep(20, TimeUnit.SECONDS);
    destroy();
  }
}

代码说明

1、提交方法主要参数有,需要执行的Callable,结果的Consumer,异常的Consumer。其中Callable调整成Supplier也是没什么问题。

2、提供摧毁线程池方法。

执行结果

OK没什么问题。

总结

追求优雅是个好习惯。

如果本工具对你有用的话,请点个赞吧,这对作者很重要,谢谢。

到此这篇关于Java 异步线程监听与结果回调及异常捕获总结分析的文章就介绍到这了,更多相关Java 异步线程监听内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring创建Bean的生命周期详析

    Spring创建Bean的生命周期详析

    这篇文章主要介绍了Spring创建Bean的生命周期详析,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • 详解JavaEE中Apollo安装使用小结

    详解JavaEE中Apollo安装使用小结

    这篇文章主要介绍了详解JavaEE中Apollo安装与使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • java创建子类对象设置并调用父类的变量操作

    java创建子类对象设置并调用父类的变量操作

    这篇文章主要介绍了java创建子类对象设置并调用父类的变量操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • java使用DOM4J对XML文件进行增删改查操作

    java使用DOM4J对XML文件进行增删改查操作

    这篇文章主要为大家详细介绍了java使用DOM4J对XML文件进行增删改查操作,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • Java日期接收报错:could not be parsed, unparsed text found at index 10解决办法

    Java日期接收报错:could not be parsed, unparsed text found a

    在做Java开发时肯定会碰到传递时间参数的情况,这篇文章主要给大家介绍了关于Java日期接收报错:could not be parsed, unparsed text found at index 10的解决办法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • springboot+mybatis+枚举处理器的实现

    springboot+mybatis+枚举处理器的实现

    在Spring boot项目开发中经常遇到需要使用枚举的场景,本文就介绍了springboot+mybatis+枚举处理器的实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Java向数据库中插入数据后获取自增ID的常用方法

    Java向数据库中插入数据后获取自增ID的常用方法

    有时候因为新增的需求需要获取刚刚新增的数据的自增的主键ID,下面这篇文章主要给大家介绍了关于Java向数据库中插入数据后获取自增ID的常用方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • Java中的Callable实现多线程详解

    Java中的Callable实现多线程详解

    这篇文章主要介绍了Java中的Callable实现多线程详解,接口Callable中有一个call方法,其返回值类型为V,这是一个泛型,值得关注的是这个call方法有返回值,这意味着线程执行完毕后可以将处理结果返回,需要的朋友可以参考下
    2023-08-08
  • JDBC连接数据库的方法汇总

    JDBC连接数据库的方法汇总

    这篇文章主要介绍了JDBC连接数据库的方法,结合实例形式总结分析了JDBC连接各种常见数据库的相关实现技巧,需要的朋友可以参考下
    2016-08-08
  • 子类继承父类时构造函数相关问题解析

    子类继承父类时构造函数相关问题解析

    这篇文章主要介绍了子类继承父类时构造函数相关问题解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11

最新评论