欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-04 11:02:02
前言工作中是否遇到这样的场景?1、需要异步线程执行,而且需要获取到线程执行返回的结果。2、如果执行过程异常,可以按照自定义方式消费异常信息。如果只是单纯的使用callable可以实现,本文提供更加优雅...

前言

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

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、提供摧毁线程池方法。

执行结果

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

ok没什么问题。

总结

追求优雅是个好习惯。

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

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

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