java多線程中的異常處理

來源:互聯網
上載者:User

在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返回給調用方,由調用方來根據異常情況決定如何應對。不過要特別注意的是,此時子線程早以終結。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.