前言
工作中是否遇到這樣的場景?
1、需要異步線程執行,而且需要獲取到線程執行返回的結果。
2、如果執行過程異常,可以按照自定義方式消費異常信息。
如果只是單純的使用Callable可以實現,本文提供更加優雅的工具類。
Maven依賴
1
2
3
4
5
6
7
8
9
10
11
|
< 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 > |
代碼
不廢話,上代碼。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
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沒什么問題。
總結
追求優雅是個好習慣。
如果本工具對你有用的話,請點個贊吧,這對作者很重要,謝謝。
到此這篇關于Java 異步線程監聽與結果回調及異常捕獲總結分析的文章就介紹到這了,更多相關Java 異步線程監聽內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://huyi-aliang.blog.csdn.net/article/details/121049222