Ich habe einige Diskussionen in dieser Richtung gesehen, aber keine spezifische Antwort auf meine Frage. Ich möchte eine Aufgabe neu starten, wenn ein Thread aufgrund einer nicht abgefangenen Ausnahme abstürzt. Ist es sicher, pool.execute (runnable) aus dem UncaughtExceptionHandler-Set des sterbenden Threads aufzurufen?Task von UncaughtExceptionHandler erneut ausführen?
Im Idealfall, wenn das thrownable eine RuntimeException ist, möchte ich einfach das runnable zum Pool, z.
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;
}
});
Gibt es einen besseren Weg oder einen sichereren Weg, dies zu tun?
Danke!
Die threadMap ist nur um mir zu ermöglichen, den Monitor/Runnable, der dem Thread mit Ausnahme entspricht, zu erhalten. restartMax dient lediglich dazu, Threads, die unmittelbar auf einen dauerhaften Fehler stoßen, nicht unbegrenzt neu zu starten. Dieser Mechanismus soll eine vorübergehende Ausnahme wiederherstellen, die nicht explizit behandelt wurde. – batkins