J'ai quelques services exécutants qui planifiez des tâches locales telles que la lecture d'un fichier, la connexion à la DB, etc. Ces processus font une énorme quantité de journalisation, qui est étendue basée sur le fait qu'il y a de nombreux threads fonctionnant simultanément, écrivant leur propre chose dans le journal.
Maintenant, à un moment donné, une exception peut être soulevée, qui atteint la méthode principale où toutes les exceptions sont capturées. Je ferme ensuite tous les services et annulez chaque tâche, dans l'espoir d'éviter tout autre message au journal. Malheureusement, les messages s'affichent toujours après que j'ai tout fermé ... des idées? P>
Mise à jour: Voici un certain code P>
public class Scheduler{ private final ExecutorService service; private final ConcurrentMap<Object, Future<V>> cache; ... public void shutDown() { service.shutdownNow(); for (Future task : cache.values()) task.cancel(true); }
4 Réponses :
- fort> Essayez d'utiliser la méthode par exemple: strong> p> - strud> shutdownow () code>, il arrêtera toute la tâche lancée par cet exécutant lancer
interrompteException code>, mais
Io code> et
fonctionnement synchronisé code>
Annuler (true) code> La méthode peut être utilisée avec
Soumettre () code> méthode sur Arrêter une tâche particulière. < / strong> p> p>
C'est incorrect - ShutDownNow n'arrête pas les tâches, cela les interrompt, ce qui pourrait ou non les éteindre.
Les exécuteurs soutiennent 2 approches d'arrêt p>
Pas exactement - ShutdownNow n'arrête pas les tâches "avec force", cela ne les interrompt que, ce qui pourrait ou pourrait ne pas les arrêter.
D'accord @assylia. Modifiera mon message pour incorporer votre commentaire. Merci.
Donc, n'importe quand pour arrêter les tâches "avec force" ...?
Pourquoi voulez-vous forcer la fermeture? Ce n'est pas une bonne idée et c'est la raison pour laquelle Java ne fournit aucune méthode directe. (STOP / SUSPEND est obsolète)
Néanmoins, la meilleure réponse que j'ai trouvée jusqu'à présent. Fonctionne maintenant comme prévu. Merci encore
Lorsque vous Selon la manière dont ils réagissent à l'interruption, ils pourraient alors: P> Par exemple, si vos tâches exécutent un Un autre exemple: p> Un autre exemple, si vous appelez une méthode qui jette une interruptionException: p> shutdownnet code> Votre exécuteur ou appelez
Annuler (true) code> (à la manière suivante: shutdownow code> annule déjà les tâches déjà soumises afin que votre boucle soit inutile) Vos tâches sont interrompues.
tandis que (vrai) code> boucle, vous pouvez le remplacer par quelque chose comme: p>
@ Bober02 Dans vos tâches, vous devez vérifier régulièrement si le thread a été interrompu - lorsque vous détectez une interruption, nettoyez-la si nécessaire et quittez la tâche.
Je ne comprends pas ce tbh. Je soumets une tâche au service exécuteur, qui stocke à l'interne tous les threads. Tout ce que je peux faire, c'est utiliser l'API pour la fermer. Quels discussions surviennent?
@ Bober02 J'ai ajouté quelques exemples de vos runnables (tâches) pourraient ressembler - j'espère qu'il est plus clair maintenant.
La tâche continuera à fonctionner jusqu'à ce qu'il atteigne un point où il détecte le fil a été interrompu. Cela peut arriver lors de l'appelant des fonctions système ou thread et vous pouvez obtenir une exception projetée. Dans votre cas, vous devez probablement vous vérifier en appelant p>
C'est une bonne idée de le faire si votre code exécute des boucles et que vous vous attendez à être arrêté de cette manière. P> fil.currentThread (). Isinterrupted () code> p>
Donnez-nous un code si vous ne vous dérangeez pas. Toute journalisation de chances est faite de manière asynchrone? Utilisez-vous
shutdown code> au lieu de
shutdownnet code>? Il y a une myriade de raisons.
Le fait que vous puissiez arrêter le service et annuler les tâches ne signifie pas que ces tâches s'arrêtent immédiatement.