栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java 异步线程监听、结果回调、异常捕获 | Java工具类

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java 异步线程监听、结果回调、异常捕获 | Java工具类

目录

前言

Maven依赖

代码

总结


前言

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

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

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

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

Maven依赖

        
            cn.hutool
            hutool-all
            5.7.15
        
        
        
            com.google.guava
            guava
            31.0.1-jre
        

代码

不废话,上代码。

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;


public class AsyncListenUtil {
  public static final ExecutorService executorService =
      Executors.newFixedThreadPool(10, new CustomizableThreadFactory("LISTEN-"));
  public static final ListeningExecutorService listeningExecutorService =
      MoreExecutors.listeningDecorator(executorService);

  
  public static  void submit(
      Callable work, Consumer consumer, Consumer errorConsumer) {
    ListenableFuture listenableFuture = listeningExecutorService.submit(work);
    Futures.addCallback(
        listenableFuture,
        new FutureCallback() {
          @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没什么问题。

总结

追求优雅是个好习惯。

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

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/357677.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号