要打印出定时任务线程可能出现的问题,需要用到java.lang.Thread.UncaughtExceptionHandler这个接口,通过这个接口可以访问到某个线程抛出的异常,并可以进行一些操作。不过这个过程不是传统的异常处理,并不能对多线程任务抛出的异常进行捕捉和处理。所以,我认为主要还是起到调试的作用,可以借助logger在这里打印出errorMessage。
实现UncaughtExceptionHandler接口,需要覆盖uncaughtException(Thread t, Throwable e)方法。
@Override
public void uncaughtException(Thread t, Throwable e) {
Logger logger = Logger.getLogger(t.getName());
logger.info(e.getMessage());
e.printStackTrace();
}
覆盖ScheduledThreadPoolExecutor类的afterExecute方法,加入UncaughtExceptionHandler,如下:
@Override
public void afterExecute(Runnable r, Throwable t){
super.afterExecute(r, t);
try {
((Future<?>)r).get();
} catch (InterruptedException e) {
} catch (ExecutionException e) {
new SchedulerExceptionHandler()
.uncaughtException(Thread.currentThread(), e);
}
}
由此,可以打印错误信息,方便调试。

