Java 異步線程監(jiān)聽與結(jié)果回調(diào)及異常捕獲總結(jié)分析
前言
工作中是否遇到這樣的場(chǎng)景?
1、需要異步線程執(zhí)行,而且需要獲取到線程執(zhí)行返回的結(jié)果。
2、如果執(zhí)行過(guò)程異常,可以按照自定義方式消費(fèi)異常信息。
如果只是單純的使用Callable可以實(shí)現(xiàn),本文提供更加優(yōu)雅的工具類。
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:
* 異步線程監(jiān)聽回調(diào)工具 @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);
/**
* 提交任務(wù)
*
* @param work Callable需要線程執(zhí)行的內(nèi)容
* @param consumer 結(jié)果消費(fèi)
* @param errorConsumer 異常消費(fèi)
* @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 需要執(zhí)行的內(nèi)容
ThreadUtil.sleep(10, TimeUnit.SECONDS);
return "I finished my work";
},
result -> {
// todo 結(jié)果處理
System.out.println("listen get :" + result);
},
throwable -> {
// todo 異常處理
System.out.println(throwable.getMessage());
});
ThreadUtil.sleep(20, TimeUnit.SECONDS);
destroy();
}
}
代碼說(shuō)明
1、提交方法主要參數(shù)有,需要執(zhí)行的Callable,結(jié)果的Consumer,異常的Consumer。其中Callable調(diào)整成Supplier也是沒什么問題。
2、提供摧毀線程池方法。
執(zhí)行結(jié)果

OK沒什么問題。
總結(jié)
追求優(yōu)雅是個(gè)好習(xí)慣。
如果本工具對(duì)你有用的話,請(qǐng)點(diǎn)個(gè)贊吧,這對(duì)作者很重要,謝謝。

到此這篇關(guān)于Java 異步線程監(jiān)聽與結(jié)果回調(diào)及異常捕獲總結(jié)分析的文章就介紹到這了,更多相關(guān)Java 異步線程監(jiān)聽內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java Web Listener實(shí)現(xiàn)事件監(jiān)聽與處理
Java Web開發(fā)中的Listener是一種事件機(jī)制,通過(guò)監(jiān)聽Web應(yīng)用程序的事件,實(shí)現(xiàn)對(duì)事件的處理,從而實(shí)現(xiàn)更加靈活和高效的應(yīng)用程序開發(fā)。Listener能夠監(jiān)聽的事件包括應(yīng)用程序啟動(dòng)和關(guān)閉、Session創(chuàng)建和銷毀、請(qǐng)求和響應(yīng)對(duì)象的創(chuàng)建和銷毀等2023-04-04
Java ArrayList add(int index, E element)和set(int index, E el
今天小編就為大家分享一篇關(guān)于Java ArrayList add(int index, E element)和set(int index, E element)兩個(gè)方法的說(shuō)明,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-10-10
Windows同時(shí)配置兩個(gè)jdk環(huán)境變量的操作步驟
Java Development Kit (JDK) 是開發(fā)Java應(yīng)用程序的基礎(chǔ),包含了編譯器、調(diào)試器以及其他必要的工具,本指南將一步步指導(dǎo)您完成在Windows操作系統(tǒng)上同時(shí)配置兩個(gè)jdk環(huán)境變量的操作步驟,需要的朋友可以參考下2024-09-09
ShardingSphere jdbc實(shí)現(xiàn)分庫(kù)分表核心概念詳解
這篇文章主要為大家介紹了ShardingSphere jdbc實(shí)現(xiàn)分庫(kù)分表核心概念詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
Spring如何基于注解顯式實(shí)現(xiàn)自動(dòng)裝配
這篇文章主要介紹了Spring如何基于注解顯式實(shí)現(xiàn)自動(dòng)裝配,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
帶你了解Java數(shù)據(jù)結(jié)構(gòu)和算法之2-3-4樹
這篇文章主要為大家介紹了Java數(shù)據(jù)結(jié)構(gòu)和算法之2-3-4樹,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-01-01

