公司自己做的任務處理程式,原理是啟動多個任務處理線程去任務隊列裡面擷取任務并執行,運作一段時間後發現程序在單任務不處理。分析後發現原來任務處理程式裡面存在RnntimeException,每次發生時會造成目前線程退出也就引發了這樣一個錯誤。
解決方法其實很簡單就是利用線程的ExceptionHandler機制,自定義和exception處理程式,當出現問題的時候記錄當然任務,重新啟動線程。一下是個簡單的例子
定義exceptionhandler
package mthread.exceptionhandler;
import java.lang.Thread.UncaughtExceptionHandler;
public class MyUnCaughtExceptionHandler implements UncaughtExceptionHandler {
@Override
public void uncaughtException(Thread t, Throwable e) {
// TODO Auto-generated method stub
System.out.println(e.getMessage());
}
}
模拟異常并設定ExceptionHandler
package mthread.sampleexception;
import mthread.exceptionhandler.MyUnCaughtExceptionHandler;
public class CaughtException {
/**
* @param args
*/
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while(true){
System.out.println("start");
for (int i = 2; i >=0; i--) {
System.out.println(""+i+":"+(2/i));
}
System.out.println("end");
}
}
});
thread.setUncaughtExceptionHandler(new MyUnCaughtExceptionHandler());
thread.start();
}
}
以上程式未恢複線程