Java 异步线程监听与结果回调及异常捕获总结分析
作者:剑客阿良_ALiang 发布时间:2021-10-14 01:23:40
标签:Java,异步线程监听,结果回调,异常捕获
前言
工作中是否遇到这样的场景?
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没什么问题。
来源:https://huyi-aliang.blog.csdn.net/article/details/121049222


猜你喜欢
- 今天写一个小程序有一个给图片加上阴影的需求,记得WPF的Effect中就有阴影特效,就打算用它了。代码如下:using (var image
- 引言容器是Java基础类库中使用频率最高的一部分,Java集合包中提供了大量的容器类来帮组我们简化开发,我前面的文章中对Java集合包中的关
- Token 一定要放在请求头中吗? 答案肯定是否定的,本文将从源码的角度来分享一下 spring security oauth2 的解析过程
- 本文实例为大家分享了unity实现虚拟摇杆控的具体代码,供大家参考,具体内容如下using UnityEngine;using UnityE
- 本文简单分析了C/C++中常用函数的易错点,包括memset、sizeof、getchar等函数。分享给大家供大家参考之用。具体分析如下:1
- 测试spring cloud 使用consul注册服务的时候,出现critical,如下:怎么解决这个问题,现在只能看到health che
- 在你的jar文件当前目录中建立一个bat文件:内容是:注意文件名要对应@echo offSTART "commandServer&
- 1、使用Adobe PDF Reader控件。从COM组件库中找到Adobe PDF Reader控件,添加到工具箱中。从工具箱中拖入PDF
- poi导入纯数字等问题用poi导出excel时候,如果单元格设置纯数字,输入的数据一旦过大就是自动显示成科学记数法,导致导入后的数据出错,解
- 我们在做应用开发的时候,一个Activity里面可能会以viewpager(或其他容器)与多个Fragment来组合使用。而ViewPage
- 一、Mybatis简介Mybatis是一款超级无敌的持久层框架,它支持自定义SQL、存储过程以及高级映射。Mybatis可以通过简单的XML
- 废话不多说了,直接给大家贴java代码了。 import java.io.IOException;import sun.net.Telnet
- Android输入框实时模糊搜索很多开发场景会用到搜索框实时模糊搜索来帮助用户输入内容,如图思路是在EditText 字符变动的时候 弹出L
- idea无法切换分支报错idea拉取项目后,master分支配置完项目基础配置后,生成.iml等文件不受git管理后无法检出其他分支报错如下
- 在系统的管理员有着实际的应用,对于一个数据库管理系统来说,数据库安全还是挺重要的,所以在存入到数据库的密码通常都是加密的。即使有着hack攻
- 测试环境为Adnroid 2.1以上。 1.AndroidManifest.xml 权限配置: 添加互联网访问权限: <uses-pe
- 今天老师想让我帮忙把她们200多张寸照换成白底的,这些寸照里面多为蓝色底,红色底。用ps?不!用java!!对,我第一反应就是用java,到
- 介绍装饰者模式(Decorator Pattern):动态地给一个对象增加一些额外的职责,增加对象功能来说,装饰模式比生成子类实现更为灵活。
- 知识点:1.使用SQL Helper创建数据库2.数据的增删查改(PRDU:Put、Read、Delete、Update)背景知识:上篇文章
- 本文实例为大家分享了Androidstudio调用摄像头拍照并保存照片的具体代码,供大家参考,具体内容如下首先在manifest.xmlns