2021-08-26 java 主線程捕獲子線程異常_Java子線程中的異常處理

java 主線程捕獲子線程異常_Java子線程中的異常處理


正常情況下異常需要自己的線程中取catch的,在主線程是抓不住的,而子線程異常沒抓住的話,就是打印在控制臺不方便排查,下面介紹一些處理


1.自定義實現(xiàn)Thread.UncaughtExceptionHandler,并制定線程工程時生產(chǎn)的線程都有這個策略


static class ThreadFactoryMy implements ThreadFactory{

??? @Override

??? public Thread newThread(Runnable r) {

??????? Thread thread = new Thread(r);

??????? thread.setUncaughtExceptionHandler(newUncaughtExceptionHandlerMy());

??????? return thread;

??? }

}

static class UncaughtExceptionHandlerMy implements Thread.UncaughtExceptionHandler{

??? @SneakyThrows

??? @Override

??? public void uncaughtException(Threadt, Throwable e) {

??????? log.error(e.getMessage());

??? }

}


2.創(chuàng)建線程

???????//1.手動創(chuàng)建

???????Thread student = new Thread();

???????student.setUncaughtExceptionHandler(new UncaughtExceptionHandlerMy());

???????student.start();

???????//2.ExecutorService創(chuàng)建

? ??????ExecutorService executorService =Executors.newFixedThreadPool(3, new ThreadFactoryMy());

???????//3 ThreadPoolTaskExecutor創(chuàng)建

???????ThreadPoolTaskExecutor threadPoolTaskExecutor = newThreadPoolTaskExecutor();

???????threadPoolTaskExecutor.setThreadFactory(new ThreadFactoryMy());


3.但是上述只會在子線程中抓住并打印,若需要主線得到子線程的異常,并開展業(yè)務,則

實現(xiàn)callabel,用future返回線程執(zhí)行結果




??static class Teacher implements Callable {


???????@Override

???????public Object call() throws Exception {

???????????int i = 1 / 0;

???????????System.out.println("執(zhí)行");

???????????return null;

???????}

}


主線程

try {

???????????Future submit = executorService.submit(new Teacher());

???????????Object o = submit.get();


???????} catch (Exception e) {

???????????System.out.println("抓住子線程異常");

???????????throw new RuntimeException("自定義異常");

???????}

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容