建議122:使用線程異常處理器提升系統(tǒng)可靠性
我們要編寫一個(gè)Socket應(yīng)用,監(jiān)聽指定端口,實(shí)現(xiàn)數(shù)據(jù)包的接收和發(fā)送邏輯,這在早期系統(tǒng)間進(jìn)行數(shù)據(jù)交互是經(jīng)常使用的,這類接口通常需要考慮兩個(gè)問題:一個(gè)是避免線程阻塞,保證接收的數(shù)據(jù)盡快處理;二是:接口的穩(wěn)定性和可靠性問題,數(shù)據(jù)包很復(fù)雜,接口服務(wù)的系統(tǒng)也很多,一旦守候線程出現(xiàn)異常就會(huì)導(dǎo)致Socket停止,這是非常危險(xiǎn)的,那我們有什么辦法避免嗎?
Java1.5版本以后在Thread類中增加了setUncaughtExceptionHandler方法,實(shí)現(xiàn)了線程異常的捕捉和處理??赡艽蠹視?huì)有一個(gè)疑問:如果Socket應(yīng)用出現(xiàn)了不可預(yù)測(cè)的異常是否可以自動(dòng)重啟呢?其實(shí)使用線程異常處理器很容易解決,我們來看一個(gè)異常處理器應(yīng)用實(shí)例,代碼如下:
class TcpServer implements Runnable { // 創(chuàng)建后即運(yùn)行 public TcpServer() { Thread t = new Thread(this); t.setUncaughtExceptionHandler(new TcpServerExceptionHandler()); t.start(); } @Override public void run() { for (int i = 0; i < 3; i++) { try { Thread.sleep(1000); System.out.println("系統(tǒng)正常運(yùn)行:&quo