Java 異步線程監(jiān)聽與結(jié)果回調(diào)及異常捕獲總結(jié)分析
前言
工作中是否遇到這樣的場景?
1、需要異步線程執(zhí)行,而且需要獲取到線程執(zhí)行返回的結(jié)果。
2、如果執(zhí)行過程異常,可以按照自定義方式消費異常信息。
如果只是單純的使用Callable可以實現(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); /** * 提交任務 * * @param work Callable需要線程執(zhí)行的內(nèi)容 * @param consumer 結(jié)果消費 * @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 需要執(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(); } }
代碼說明
1、提交方法主要參數(shù)有,需要執(zhí)行的Callable,結(jié)果的Consumer,異常的Consumer。其中Callable調(diào)整成Supplier也是沒什么問題。
2、提供摧毀線程池方法。
執(zhí)行結(jié)果
OK沒什么問題。
總結(jié)
追求優(yōu)雅是個好習慣。
如果本工具對你有用的話,請點個贊吧,這對作者很重要,謝謝。
到此這篇關于Java 異步線程監(jiān)聽與結(jié)果回調(diào)及異常捕獲總結(jié)分析的文章就介紹到這了,更多相關Java 異步線程監(jiān)聽內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java微信公眾平臺開發(fā)(7) 公眾平臺測試帳號的申請
這篇文章主要為大家詳細介紹了Java微信公眾平臺開發(fā)第七步,微信公眾平臺測試帳號的申請,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04SpringMVC中@RequestMapping注解用法實例
通過@RequestMapping注解可以定義不同的處理器映射規(guī)則,下面這篇文章主要給大家介紹了關于SpringMVC中@RequestMapping注解用法的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-06-06Java設計模式之解釋器模式(Interpreter模式)介紹
這篇文章主要介紹了Java設計模式之解釋器模式(Interpreter模式)介紹,Interpreter定義:定義語言的文法,并且建立一個解釋器來解釋該語言中的句子,需要的朋友可以參考下2015-03-03Java對MySQL數(shù)據(jù)庫進行連接、查詢和修改操作方法
這篇文章主要介紹了Java對MySQL數(shù)據(jù)庫進行連接、查詢和修改操作方法,需要的朋友可以參考下2017-07-07