Lors de l'utilisation d'un objet ExecutorService
et Future
(lors de la soumission de tâches Runnable
), si je spécifie une valeur de délai d'attente pour la fonction get du futur, le thread sous-jacent est-il tué lorsqu'un TimeoutException
est lancé?
Ce ne est pas. Pourquoi ça? A moins que vous ne le lui disiez.
Il y a une préoccupation très valable ici dans le cas d'un Callable par exemple. Si vous avez attendu le résultat pendant 20 secondes et que vous ne l'avez pas obtenu, alors le résultat ne vous intéresse plus. À ce moment, vous devez annuler la tâche.
Quelque chose comme ça:
Future<?> future = service.submit(new MyCallable());
try {
future.get(100, TimeUnit.MILLISECONDS);
} catch (Exception e){
e.printStackTrace();
future.cancel(true); //this method will stop the running underlying task
}
Non, ça ne marche pas. De plus, il n'y a même aucune tentative d'interrompre la tâche. Tout d'abord, Future.get avec timeout ne le dit pas. Deuxièmement, essayez mon test pour voir comment il se comporte
ExecutorService ex = Executors.newSingleThreadExecutor();
Future<?> f = ex.submit(new Runnable() {
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("finished");
}
});
f.get(1, TimeUnit.SECONDS);
en 1 sec il imprime
Exception in thread "main" Java.util.concurrent.TimeoutException
at Java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.Java:228)
at Java.util.concurrent.FutureTask.get(FutureTask.Java:91)
at Test1.main(Test1.Java:23)
après encore 1 seconde, la tâche se termine avec succès
finished
Il semble que vous deviez tuer, annuler ou arrêter la tâche explicitement
Gestion des exceptions de Java Tâches ExecutorService
Comment puis-je faire revenir FutureTask après TimeoutException?