問題描述:java
週一發現線上的一個程序從上週日一直運行「卡住」了十多個小時,原本是10MIN一次更新數據的,致使如今數據一直停留在過去,而且因爲程序一直「卡住」不報錯,使得咱們收不到報警短信通知。併發
問題分析與定位:ide
根據報錯日誌來看,是一個類A的static區域發生了異常,因爲在static區域並無catch住這個異常,致使類A沒法加載成功,JAVA異常打印以下:
spa
java.lang.NoClassDefFoundError: Could not initialize class線程
但是,爲何程序會「卡住」呢?日誌
接下來,分析了下,程序的運行結構,發現:
it
程序會開啓N個線程去併發請求數據,而後利用JOIN的方式,合併線程,待全部線程都請求完後,再去執行其餘步驟。在線程任務類中的run方法利用到了那個類A!更加劇要的是,在對類A方法調用也沒有任何異常的處理!
io
也就是說這N個線程運行run方法,就會拋出異常,線程就會終結!class
線程已經死掉了,但是JOIN還在等待着線程進行合併,一直等待着他們活過來!請求
這就是程序爲何一直卡住的根本緣由!
可見,咱們在對待線程的異常處理上,應該當心,若是咱們不處理,那麼這個線程可能死掉,咱們還不知道!那麼處理線程異常的方式有哪些呢?
線程內解決:
線程是一段獨立的代碼,有問題,應該讓它本身來CATCH住處理,即應該注意在run方法中處理異常。
線程外解決:
Thread方法提供了一個方法:setUncaughtExceptionHandler
能夠經過這個方法來實現線程代碼以外處理未捕獲異常!