Question

J'utilise le framework Executor pour lancer plusieurs threads à l'aide d'un pool de threads, à savoir newFixedThreadPool. J'utilise threadpool.submit (aThread) pour soumettre des travaux à exécuter par le pool de threads, mais cela fonctionne correctement, mais je dois déterminer à quel moment tous les threads sont terminés pour pouvoir poursuivre le traitement. J'ai regardé en utilisant Future.get () qui bloque jusqu'à ce que le thread soit terminé, le problème étant qu'il bloque jusqu'à ce qu'un résultat soit disponible. J'ai également envisagé d'appeler de manière continue la méthode isTerminated () suivie d'un sommeil après la fermeture de l'ordinateur pour vérifier si tous les threads étaient terminés, mais cela ne me semble pas intéressant. Y at-il une autre façon plus propre à cela? De plus, si une exception est déclenchée dans l'un des threads, je souhaite pouvoir mettre fin à tous les autres threads en cours d'exécution et arrêter tout démarrage d'un thread en file d'attente dans le pool. Quel est le meilleur mécanisme pour faire cela?

J'attends vos réponses avec impatience

TIA

Était-ce utile?

La solution

L’une des méthodes les plus simples consiste à modifier les tâches soumises. En enregistrant un rappel avec chaque tâche, il peut notifier l'achèvement normal ou une exception sans interrogation par le thread principal.

Vous pouvez rédiger une simple wrapper qui le fera pour tout Runnable .

Ou, en suivant cet exemple, vous pouvez étendre l'idée à tout appelable .

class CallbackTask<T>
  implements Callable<T>
{

  private final Callable<? extends T> task;

  private final Callback<T> callback;

  CallbackTask(Callable<? extends T> task, Callback<T> callback)
  {
    this.task = task;
    this.callback = callback;
  }

  public T call()
    throws Exception
  {
    try {
      T result = task.call();
      callback.complete(result);
      return result;
    }
    catch (Exception ex) {
      callback.failed(ex);
      throw ex;
    }
  }

}

Autres conseils

Utilisez ExecutorService #shutdown () , puis ExecutorService # waitTermination ()

Par exemple:

ExecutorService service = Executors.newCachedThreadPool();
service.submit(...);
service.submit(...);
service.shutdown();
service.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);

// All tasks have now finished

En ce qui concerne votre notification lorsqu'une tâche échoue avec une exception. Vous devrez fournir un ThreadFactory au service d'exécution qui définit un gestionnaire "Exception non capturée". pour chaque fil qu'il crée. Ce gestionnaire d'exceptions peut alors terminer les tâches en cours d'exécution.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top