java多線程中的異常處理

Java多線程程序中,全部線程都不容許拋出未捕獲的checked exception,也就是說各個線程須要本身把本身的checked exception處理掉。這一點是經過java.lang.Runnable.run()方法聲明(由於此方法聲明上沒有throw exception部分)進行了約束。可是線程依然有可能拋出unchecked exception,當此類異常跑拋出時,線程就會終結,而對於主線程和其餘線程徹底不受影響,且徹底感知不到某個線程拋出的異常(也是說徹底沒法catch到這個異常)。JVM的這種設計源自於這樣一種理念:「線程是獨立執行的代碼片段,線程的問題應該由線程本身來解決,而不要委託到外部。」基於這樣的設計理念,在Java中,線程方法的異常(不管是checked仍是unchecked exception),都應該在線程代碼邊界以內(run方法內)進行try catch並處理掉.java

 

但若是線程確實沒有本身try catch某個unchecked exception,而咱們又想在線程代碼邊界以外(run方法以外)來捕獲和處理這個異常的話,java爲咱們提供了一種線程內發生異常時可以在線程代碼邊界以外處理異常的回調機制,即Thread對象提供的setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)方法。編程

經過該方法給某個thread設置一個UncaughtExceptionHandler,能夠確保在該線程出現異常時能經過回調UncaughtExceptionHandler接口的public void uncaughtException(Thread t, Throwable e) 方法來處理異常,這樣的好處或者說目的是能夠在線程代碼邊界以外(Thread的run()方法以外),有一個地方能處理未捕獲異常。可是要特別明確的是:雖然是在回調方法中處理異常,但這個回調方法在執行時依然還在拋出異常的這個線程中!另外還要特別說明一點:若是線程是經過線程池建立,線程異常發生時UncaughtExceptionHandler接口不必定會當即回調。多線程

 

比之上述方法,還有一種編程上的處理方式能夠借鑑,即,有時候主線程的調用方可能只是想知道子線程執行過程當中發生過哪些異常,而不必定會處理或是當即處理,那麼發起子線程的方法能夠把子線程拋出的異常實例收集起來做爲一個Exception的List返回給調用方,由調用方來根據異常狀況決定如何應對。不過要特別注意的是,此時子線程早以終結。.net

相關文章
相關標籤/搜索