之前有同事說他的程序里的線程時常莫名退出,日志中沒有任何異常信息。
目前我知道的可以獲取線程異常信息的方法主要有
1、Future<?>和ScheduledFuture<?>的get()方法

2、JAVA1.5之后支持的UncaughtExceptionHandler
1 Thread thread = new Thread(() -> {run方法內的代碼塊}); 2 thread.start(); 3 thread.setUncaughtExceptionHandler((t, e) -> { 4 Logger.error(t.getName() + " ERROR\t" + e.getMessage()); 5 });
() -> {}是java1.8新特性中的lambda表達式
--------------------------------------------------------------------------------------------------------------------------------------------------------
然而,程序運行中可能會有不可預知錯誤,比如OOM(內存溢出)等系統錯誤,這種錯誤在java中屬於Error類,我們常用的都是Exception的子類,是捕獲不到這種異常的。
先看看一下java中異常的類圖:

RunTimeException是運行時異常,在編譯時不會被發現,比如除數為0;
Error前面說了,是系統級的錯誤,與java沒關系,所以java認為不需要捕獲這種異常,因為遇到這種異常說明系統有錯誤,已經無法支持程序正常運行,程序應該終止,沒必要捕獲和處理了。
但是對於我們開發人員和維護人員來說,我們有必要知道這些錯誤的詳細信息,來維護系統錯誤。比如,發生了OOM,我們可以看看系統里各進程占用內存情況,根據情況做整改,有可能是某程序代碼不合理,導致內存無限被占用。
Throwable就是這所有異常的父類了。
所以,我在同事的線程的run方法里捕獲Throwable異常來獲取異常信息。
1 @Override 2 public void run() { 3 try { 4 ... 5 } catch (Throwable t) { 6 Logger.error("xx task error!", t); 7 } 8 }
但,據說Throwable性能不佳,所以不推薦在沒必要的地方全都使用。小生目前對這方面還沒有研究,待有所了解后再補充說明。
