En attente d'une Minuterie pour finir en Java
Je suis en utilisant java.util.Minuterie pour planifier une tâche périodique. A un moment, je voudrais l'arrêter, et attendez la fin de la.
Minuterie.annuler() permettra d'éviter à l'avenir toute les tâches en cours d'exécution. Comment puis-je m'assurer que toutes les tâches ne sont pas en cours d'exécution au moment (ou attendre pour eux si ils sont?)
Je peux introduire des mécanismes de synchronisation externe, mais je ne vois pas comment ils peuvent couvrir tous les cas. Par exemple, si je synchroniser sur certains moniteurs au sein de la tâche, il me manque encore le cas lorsque la tâche juste commencé à s'exécuter mais ne prenez pas le moniteur.
Qu'est-ce que la pratique recommandée pour l'attente jusqu'à ce que toutes les tâches sont vraiment fait, y compris les tâches en cours d'exécution?
OriginalL'auteur ripper234 | 2009-08-24
Vous devez vous connecter pour publier un commentaire.
Vous serait mieux à l'aide d'un ScheduledExecutorService au lieu d'une Minuterie pour programmer votre tâche périodique. ScheduledExecutorService fournit un shutdown() méthode qui vous permettra d'exécuter toutes les tâches en attente. Vous pouvez ensuite appeler awaitTermination() pour attendre l'arrêt() pour terminer.
Timer
pour une raison quelconque, vous pouvez utiliser une Condition (java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/locks/...) pour synchroniser les deux fils sur un événement (tel que l'achèvement de la tâche planifiée).Ouais, point 68 Effective Java (2e éd) recommande ScheduledThreadPoolExecutor plus flexible de remplacement pour la Minuterie. +1 pour la mention de cela, que les pratiques recommandées ont été demandé.
Ouais, je devrais vraiment lire ce livre.
Ou utiliser un CountdownLatch etc. stackoverflow.com/questions/289434/...
OriginalL'auteur Mark
Quelque chose comme ci-dessous peut aider à vos besoins-
Thread.sleep(...)
au lieu deThread.currentThread().sleep(...)
parce que c'est une méthode statique; votre code pourraient vous inciter à fairesomeOtherThread.sleep(...)
qui ne dort passomeOtherThread
.OriginalL'auteur Keshav