Ich möchte Ausnahmen behandeln, die von Arbeitsthreads in ThreadPoolExecutor#afterExecute()
method ausgelöst werden. Derzeit habe ich diesen Code:
Wenn ich den Code ausführe, bekomme ich:
%Vor% Warum ist der Parameter Throwable t
null
in afterExecute()
? Sollte es nicht die SQLException
Instanz sein?
Dies ist tatsächlich erwartetes Verhalten.
Zitieren afterExecute
Javadoc:
Wenn Nicht-Null, ist Throwable die nicht erfasste RuntimeException oder Error, die die Ausführung abrupt beendet hat.
Dies bedeutet, dass die aufrufbare Instanz RuntimeException
oder Error
ist, nicht aktiviert Exception
. Da SQLException
eine geprüfte Ausnahme ist, wird sie nicht an afterExecute
übergeben.
Es gibt auch noch etwas anderes hier (immer noch das Javadoc zitierend):
Hinweis: Wenn Aktionen explizit oder über Methoden wie "submit" in Aufgaben eingeschlossen sind (z. B.
FutureTask
), erfassen und bearbeiten diese Aufgabenobjekte Berechnungsausnahmen und verursachen keine abrupten Beendigung, und die internen Ausnahmen werden nicht an diese Methode übergeben.
In Ihrem Beispiel ist die Aufgabe in einem FutureTask
eingeschlossen, da Sie eine Callable
übergeben, also in diesem Fall. Auch in dir änderst du deinen Code, um RuntimeException
zu werfen, wenn nicht afterExecute
angegeben wird. Das Javadoc gibt einen Beispielcode, um das zu bearbeiten, das ich hier als Referenz kopiere:
%Vor%
Dies ist eine alternative Methode. Ein Hinweis von hier
%Vor%Die Verwendung von afterExecute dient einem anderen Zweck.
%Vor%wiederum fehlschlagen und abrupt beenden.
Tags und Links java multithreading threadpool threadpoolexecutor futuretask