執行緒的異常捕獲與執行緒池的異常捕獲 execute與submit區別
https://www.cnblogs.com/wscit/p/6100476.html
#(單執行緒情況)
對於單執行緒來說,只需要重寫UncaughtException就好了,如下:
123456789 | /** * Author: scw * Time: 16-11-24 */ public class RewriteUncatchtExceptionHandler implements Thread.UncaughtExceptionHandler{ public void uncaughtException(Thread t, Throwable e) { System.out.println( "我捕獲到了執行緒池的異常" ); } } |
12345678910 | /** * Author: scw * Time: 16-11-24 */ public class Task implements Runnable { public void run() { System.out.println( "執行任務" ); int num = Integer.parseInt( "TT" ); } } |
1234567 | /** * 對於單個執行緒出現的異常情況可以使用異常處理器,可以捕獲到 */ public static void catchSingleThread() { Task task = new Task(); Thread thread = new Thread(task); thread.setUncaughtExceptionHandler( new RewriteUncatchtExceptionHandler()); thread.start(); } |
執行程式,我們發現可以正常的捕獲到這個unchecked異常,但是執行緒池中我們應該怎麼處理呢?如下:
#(執行緒池)
首先我們要重寫 ThreadFactory來為每個執行緒例項化的時候建立一個handler
123456789101112 | /** * Author: scw * Time: 16-11-24 */ public class MyThreadFactory implements ThreadFactory{ public Thread newThread(Runnable r) { Thread t = new Thread(r); t.setUncaughtExceptionHandler( new RewriteUncatchtExceptionHandler()); System.out.println( "Thread[" + t.getName() + "] created." ); return t; } } |
這個地方還可以setDemon,使執行緒池內執行緒皆為守護執行緒,主執行緒退出後,強制銷燬執行緒池
12345678 | /** * 雖然從寫ThreadFactory以後,可以捕獲到異常,但是隻能是execute,而submit還是不行 how to choose one */ public static void catchedExecutor() { ExecutorService executorService = Executors.newCachedThreadPool( new MyThreadFactory()); executorService.execute( new Task()); executorService.shutdownNow(); } |
現在問題來了,就是這樣雖然可以捕獲到異常,但是隻能是使用execute的時候可以,使用submit的時候是不成功的,那麼我們應該如何選擇呢?