In den ausführbaren Aufgaben, die ich meinem benutzerdefinierten ThreadPoolExecutor geben, fange ich alle Throwable. Und dann, anstatt die gleiche Ausnahme zu werfen, werfe ich eine benutzerdefinierte RuntimeException. Ich überschreibe die Methode afterExecute (Runnableable runnable, Throwable throwable) in meinem Executor, und diese Ausnahme steht mir erwartungsgemäß nach der Ausführung zur Verfügung. Ich verstehe, dass mit dieser Ausnahme nichts passieren sollte, weil ich mich darum gekümmert habe. Allerdings wird die Ausnahme zeitweise zum Hauptthread zugelassen, der dann mit der Thread.getUncaughtExceptionHandler() -Anweisung auf System.err gedruckt wird. Ich habe dies bestätigt durch die folgende Platzierung in meiner Anwendung Hauptmethode:ThreadPoolExecutor ermöglicht intermittierend nicht abgefangene Ausnahme bis zum Hauptthread
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
System.err.println("I shouldn't have got here!");
}
});
Jetzt kann ich einfach nichts mehr im Code tut oben, und die Ausgabe zu System.err verhindern, aber ich würde lieber herausfinden, warum die ThreadPoolExecutor lässt Ausnahmen von den Aufgaben entkommen, die ich ihm gebe. Irgendwelche Gedanken darüber, warum das passieren könnte?
_Die Ausnahme wird durch den Hauptthread zugelassen, der dann auf System.err_ gedruckt wird. Was bringt Sie auf den Gedanken, dass es der Hauptthread beim Drucken ist, oder meinen Sie etwas anderes? – Savior
Das 'setDefaultUncaughtExceptionHandler': _Stellen Sie den Standardhandler ein, der aufgerufen wird, wenn ein Thread aufgrund einer nicht abgefangenen Ausnahme abrupt beendet wird und kein anderer Handler für diesen Thread definiert wurde._ Es ist immer noch derselbe Thread, der den Druckvorgang ausgeführt hat. – Savior
Sie müssen uns Ihren benutzerdefinierten 'ThreadPoolExecutor' anzeigen, wenn Sie uns bei der Suche nach einem Leck unterstützen sollen. – Savior