一次線上多線程程序問題排查

問題描述: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

能夠經過這個方法來實現線程代碼以外處理未捕獲異常!

相關文章
相關標籤/搜索