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

网友投稿 715 2022-09-17


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

前言

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

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.ExecutdWoayhGorService;

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 泛型

*/

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 wordWoayhGk";

},

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没什么问题。

总结

追求优雅是个好习惯。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:动态路由(rip)(动态路由rip配置心得体会)
下一篇:spring定时器定时任务到时间未执行问题的解决
相关文章

 发表评论

暂时没有评论,来抢沙发吧~