1. 程式人生 > >java多執行緒中的異常處理

java多執行緒中的異常處理

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

在java多執行緒程式中,所有執行緒都不允許丟擲未捕獲的checked exception,也就是說各個執行緒需要自己把自己的checked exception處理掉。這一點是通過java.lang.Runnable.run()方法宣告(因為此方法宣告上沒有throw exception部分)進行了約束。但是執行緒依然有可能丟擲unchecked exception,當此類異常跑丟擲時,執行緒就會終結,而對於主執行緒和其他執行緒完全不受影響,且完全感知不到某個執行緒丟擲的異常(也是說完全無法catch到這個異常)。JVM的這種設計源自於這樣一種理念:“執行緒是獨立執行的程式碼片斷,執行緒的問題應該由執行緒自己來解決,而不要委託到外部。”基於這樣的設計理念,在Java中,執行緒方法的異常(無論是checked還是unchecked exception),都應該線上程程式碼邊界之內(run方法內)進行try catch並處理掉.


但如果執行緒確實沒有自己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返回給呼叫方,由呼叫方來根據異常情況決定如何應對。不過要特別注意的是,此時子執行緒早以終結。


           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述