Je souhaite gérer les exceptions émises par les threads de travail dans la méthode ThreadPoolExecutor#afterExecute()
. À l'heure actuelle, j'ai ce code:Pourquoi l'exception est-elle nulle dans AfterExecute() de ThreadPoolExecutor?
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..");
}
}
}
Si je lance le code que je reçois la sortie:
in call()
in afterExecute()
t == null
Pourquoi paramètre Throwable t
null
dans afterExecute()
? Ne devrait-il pas être l'instance SQLException
?
Merci d'avoir éclairci cela. Donc toutes les exceptions vérifiées vont juste être avalées par le ThreadPoolExecutor? Et toute la gestion des exceptions doit être effectuée dans Callable # call()? –
@ potato300 Voir mon edit, il y a quelque chose d'autre qui se passe dans votre exemple spécifique (que je n'ai pas remarqué au début) – Tunaki