我已经看到了一些关于这些问题的讨论,但并没有对我的问题给出具体的答案。由于未捕获的异常而导致线程死亡时,我想重新启动任务。在死亡线程中设置的UncaughtExceptionHandler内调用pool.execute(runnable)是否安全?理想情况下,如果throwable是RuntimeException,我想只重新提交runnable到池中,例如,从UncaughtExceptionHandler中重新执行任务?
pool = Executors.newFixedThreadPool(monitors.size(), new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread thread = new Thread(r);
threadMap.put(thread, (Monitor)r);
thread.setName(((Monitor)r).getClusterName() + "-monitor");
thread.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread th, Throwable t) {
logger.error("Uncaught exception in thread: " + th.getName(), t);
if (t instanceof RuntimeException) {
Monitor m = threadMap.get(th);
if (m != null && m.runCount() < restartMax) {
logger.error("Restarting monitor due to uncaughtException: " + m.getClusterName());
pool.execute(m);
} }
}
});
return thread;
}
});
有没有更好的方法或更安全的方法来做到这一点?
谢谢!
threadMap只是为了让我得到对应于Thread的Monitor/Runnable异常。 restartMax只是为了避免无限重启立即遇到一些持续性错误的线程。该机制旨在从一些尚未明确处理的瞬态异常中恢复。 – batkins 2011-01-07 13:53:23