l'arrêt et awaitTermination qui premier appel avez-vous la différence?
Quelle est la différence entre
ExecutorService eService = Executors.newFixedThreadPool(2);
eService.execute(new TestThread6());
eService.execute(new TestThread6());
eService.execute(new TestThread6());
eService.awaitTermination(1, TimeUnit.NANOSECONDS);
eService.shutdown();
et
eService.shutdown();
eService.awaitTermination(1, TimeUnit.NANOSECONDS);
Je ne comprends pas vraiment shutdown()
. Cette méthode ne permet pas d'attendre précédemment soumis tâches d'exécution. Signifie-t-il shutdown()
peut résilier les tâches qui leur ont été soumis, mais pas terminé? J'ai essayé quelques exemples, ils ne prouvent pas, s'il vous plaît donnez-moi un exemple.
- Regardez : stackoverflow.com/questions/36644043/...
Vous devez vous connecter pour publier un commentaire.
Vous devriez appeler
shutdown
premier. Sinon, vous risquez d'attendre très longtemps, depuisawaitTermination
ne fait pas de l'arrêt de votre exécuteur testamentaire.Si vous voulais attendre pour les tâches à effectuer, plutôt que d'attendre que l'exécuteur testamentaire à l'arrêt, alors vous devriez utiliser
invokeAll
.awaitTermination
va rester là jusqu'à ce que la temporisation s'exécute. Évidemment, dans votre exemple, vous avez été en attente seulement 1 nanoseconde avant d'expirer, ce qui explique pourquoi vous n'avez pas d'observer le "très longtemps".while (!Thread.interrupted()) {System.out.println("loop"); Thread.sleep(1000);}
. Vous verrez les résultats.shutdown()
n'interrompt pas déjà en cours d'exécution des tâches. De javadoc : "Initie un arrêt dans lequel précédemment présenté les tâches sont exécutées, mais pas de nouvelles tâches seront acceptées." Si vous voulez interruption, vous devez appelershutDownNow()
.La lecture de la documentation est toujours utile:
shutdownNow :
arrêt:
awaitTermination:
shutdown
n'a pas de blocs.arrêt signifie que l'exécuteur testamentaire prend pas plus de tâches entrantes.
awaitTermination est invoquée après une demande d'arrêt.
Vous devez d'abord arrêter le service, et ensuite de bloquer et d'attente pour les threads à la fin.
Si vous voulez voir toutes les discussions de fin de l'exécution et d'insister sur l'utilisation de
awaiTermination
, vous devez définir le paramètre de délai d'attente pour être assez grand. De sorte que vous pouvez faire:Alternativement, vous pouvez faire:
De cette façon, vous êtes en mesure de s'assurer que tous les fils sont terminés en cours d'exécution, sauf s'ils sont interrompu de façon inattendue.
Après notre départ de la première tâche ThreadPoolExecutor va démarrer un Thread qui n'aura pas de fin, même après que la tâche est terminée. Au moins, il est vrai pour un pool de threads. C'est pourquoi nous avons besoin de faire appel de l'arrêt. Après l'arrêt ThreadPoolExecutor rejettera toute nouvelle tâche mais va attendre pour l'exécution de tâches pour terminer et ensuite laisser les Fils à la fin. C'est pourquoi nous avons besoin de awaitTermination après shutdwon.
Vous devez appeler
shutdownNow()
méthode après laawaitTermination()
appel de méthode qui s'est passé. Puis seulement vous pouvez trouver de l'utilisation réelle deawaitTermination()
méthode.