Java多線程之捕獲子線程中的異常---面試經
在某些場景下,我們經常需要使用多線程來執行任務提高性能,但是我們知道正常的主線程是無法處理子線程的異常的,一旦出現異常就會傳播到控制臺。這個時候我們需要在線程裏面處理異常怎麽辦呢,我們可以使用Executor來處理。
在Java5中新加入了一個Thread.UncaughtExceptionHandler接口,這個接口可以讓我們在每個Thread對象上都附著一個異常處理器,它的unacughtException()方法線程因未捕獲的異常而死亡時被調用。
首先我們我們先實現Thread.UncaughtExceptionHandler接口:
class myUncaughtExceptionhandler implements Thread.UncaughtExceptionHandler{//實現線程異常處理接口 @Override public void uncaughtException(Thread t, Throwable e) { System.out.println("cause"+ e); } }
我們在自定義一個線程工廠:
class HandlerThreadFactory implements ThreadFactory{ @Override public Thread newThread(Runnable r) { System.out.println(this+"create new thread"); Thread t = new Thread(r); System.out.println("create"+t); t.setUncaughtExceptionHandler(new myUncaughtExceptionhandler());//設置我們自定義的異常處理 //Thread.setDefaultUncaughtExceptionHandler();也可使用此方法設置默認的處理器 System.out.println("eh="+t.getUncaughtExceptionHandler()); return t; } }
最後我們實現一個Runnable接口,並在run方法中拋出一個異常:
class MyThread implements Runnable { @Override public void run() { Thread t = Thread.currentThread(); System.out.println("run()"+ t); System.out.println("eh="+t.getUncaughtExceptionHandler()); throw new RuntimeException(); } }
ok,我們再寫個main方法來測試一些:
public static void main(String[] args){ ExecutorService exe = Executors.newCachedThreadPool(new HandlerThreadFactory());//使用我們自定義的ThreadFactory exe.execute(new MyThread()); }
運行結果如下圖所示:
concurrence.HandlerThreadFactory@14ae5a5create new thread
createThread[Thread-0,5,main]
eh=concurrence.myUncaughtExceptionhandler@7f31245a
run()Thread[Thread-0,5,main]
eh=concurrence.myUncaughtExceptionhandler@7f31245a
concurrence.HandlerThreadFactory@14ae5a5create new thread
createThread[Thread-1,5,main]
eh=concurrence.myUncaughtExceptionhandler@154d7c22
causejava.lang.RuntimeException
很明顯,程序可以運行,說明異常被捕獲了,並且也是我們所拋出的異常,希望對大家有所幫助。
消化於:https://blog.csdn.net/MaybeUnforgiven/article/details/72989497
Java多線程之捕獲子線程中的異常---面試經