公司自己做的任务处理程序,原理是启动多个任务处理线程去任务队列里面获取任务并执行,运行一段时间后发现进程在单任务不处理。分析后发现原来任务处理程序里面存在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();
}
}
以上程序未恢复线程
本文探讨了在多线程程序中,如何利用Java的ExceptionHandler机制处理子线程中的RuntimeException,避免线程异常退出导致的任务中断。通过自定义异常处理程序,当线程发生异常时记录相关信息并重新启动线程,确保任务能够继续执行。

被折叠的 条评论
为什么被折叠?



