天天看點

多線程程式處理子線程異常 javaExceptionHandler機制

公司自己做的任務處理程式,原理是啟動多個任務處理線程去任務隊列裡面擷取任務并執行,運作一段時間後發現程序在單任務不處理。分析後發現原來任務處理程式裡面存在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();
	}

}
           

以上程式未恢複線程

繼續閱讀