web-dev-qa-db-fra.com

Un timeout futur tue-t-il l'exécution du thread

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é?

51
Nico Huysamen

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
    }
51
Eugene

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
16
Evgeniy Dorofeev
4
gurvinder372