Ich möchte Exceptions umgehen, die von Worker-Threads in ThreadPoolExecutor#afterExecute()
Methode geworfen werden. Zur Zeit habe ich diesen Code:Warum Ausnahme ist in ThreadPoolExecutor AfterExecute() Null?
public class MyExecutor extends ThreadPoolExecutor {
public static void main(String[] args) {
MyExecutor threadPool = new MyExecutor();
Task<Object> task = new Task<>();
threadPool.submit(task);
}
public MyExecutor() {
super(4, 20, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>(4000));
}
@Override
protected void afterExecute(Runnable r, Throwable t) {
super.afterExecute(r, t);
System.out.println("in afterExecute()");
if (t != null) {
System.out.println("exception thrown: " + t.getMessage());
} else {
System.out.println("t == null");
}
}
private static class Task<V> implements Callable<V> {
@Override
public V call() throws Exception {
System.out.println("in call()");
throw new SQLException("testing..");
}
}
}
Wenn ich den Code ausführen I Ausgabe:
in call()
in afterExecute()
t == null
Warum ist Parameter Throwable t
null
in afterExecute()
? Sollte es nicht die SQLException
Instanz sein?
Vielen Dank für das Aufräumen. Also werden alle geprüften Ausnahmen einfach vom ThreadPoolExecutor verschluckt? Und alle Ausnahmen müssen in Callable # call() behandelt werden? –
@ potato300 Sehen Sie meine Bearbeitung, es gibt etwas anderes in Ihrem spezifischen Beispiel (das habe ich zuerst nicht bemerkt) – Tunaki