問題描述:java
使用 java.util.TimerTask 任務中斷(遇到未抓取異常時後續任務不執行);
2. 使用 java.util.concurrent.Executors.xxx 線程池對於未抓取異常無異常輸出,沒法定位問題;app
定位方法:.net
對比 TimerTask/Executors/Quartz 三者對拋出異常的反應線程
問題解決:blog
建議:繼承
對於定時任務,建議使用 quartz 庫。(使用 TimerTask 有未抓取異常時會致使當前Timer終止,後續任務沒法執行)
線程池有未抓取異常時不會致使後續任務中斷,可是沒有異常信息的輸出,難以定位問題,對此,有三種方案:
)本身封裝一個RunnableWrapper、CallableWrapper,將傳入的任務包裹其中,在run方法中try-catch,並統一對未抓取異常進行異常處理/輸出;
)繼承ThreadPoolExecutor的方式來建立線程池,重寫其afterExecute(Thread, Throwable)方法,判斷第二個參數非空時得到其異常信息,統一進行處理;(注意:僅對 executor.execute(..) 啓動的任務有效,executor.submit(..)的無效)
)建立線程池時,傳入自定義的ThreadFactory,在其建立線程時,使用setUncaughtExceptionHandler(..)設置每一個線程的未抓取異常處理句柄,統一進行處理;(注意:僅對 executor.execute(..) 啓動的任務有效,executor.submit(..)的無效)
---------------------
做者:給我一片二向箔
來源:CSDN
原文:https://blog.csdn.net/abcyyjjkk/article/details/81913509
版權聲明:本文爲博主原創文章,轉載請附上博文連接!it