Programmable Minuterie Java
J'aimerais avoir un java.utils.Minuterie avec un temps programmable en java.J'ai besoin de régler en une fois un événement de se produire dans les X secondes. Si rien ne se passe entre le moment de la minuterie a été créé et les X secondes, puis l'événement se produit comme d'habitude.
Si, toutefois, avant de les X secondes s'est écoulé, j'ai décider que l'événement devrait se produire après Y secondes au lieu de cela, je veux être en mesure de dire que la minuterie de réinitialisation de son temps, de sorte que l'événement se produit dans les Y secondes.
E. g. le minuteur doit être en mesure de faire quelque chose comme:
Timer timer = new Timer();
timer.schedule(timerTask, 5000); //Timer starts in 5000 ms (X)
//At some point between 0 and 5000 ms...
setNewTime(timer, 8000); //timerTask will fire in 8000ms from NOW (Y).
Je ne vois pas le moyen de le faire à l'aide de la utils à rebours, comme si vous appelez annuler() vous ne pouvez pas planifier à nouveau.
La seule façon que je suis venu près de reproduire ce comportement est par l'utilisation de javax.swing.Minuterie et implique l'arrêt de l'original de la minuterie, et en créer un nouveau. c'est à dire:
timer.stop();
timer = new Timer(8000, ActionListener);
timer.start();
Est-il un moyen plus facile??
Vous devez vous connecter pour publier un commentaire.
Selon la
Timer
de la documentation, en Java 1.5-delà, vous devriez préférer laScheduledThreadPoolExecutor
à la place. (Comme vous pouvez le créer cette exécuteur testamentaire à l'aide deExécuteurs
.newSingleThreadScheduledExecutor()
pour la facilité d'utilisation; il crée quelque chose de beaucoup comme unTimer
.)Le truc cool, c'est, lorsque vous planifiez une tâche (en appelant
schedule()
), il renvoie uneScheduledFuture
objet. Vous pouvez l'utiliser pour annuler la tâche planifiée. Vous êtes ensuite libre de soumettre une nouvelle tâche avec un autre déclenchement temps.ETA: Le
Timer
de la documentation liée à ne pas dire n'importe quoi surScheduledThreadPoolExecutor
, cependant la OpenJDK version avait ceci à dire:TimerTask.scheduledExecutionTime()
à l'intérieur de votre tâche. Vous ne serez pas en mesure de déterminer si la tâche est "en retard" et ne devrait pas s'exécuter.myScheduledThreadPoolExecutor.getQueue().clear()
pour supprimer toutes les tâches planifiées qui n'ont pas encore courir, mais vous ne pouvez pas utiliser cette technique avecExecutors.newSingleThreadScheduledExecutor()
au lieu de cela, vous devez instancier unnew ScheduledThreadPoolExecutor(1)
car seules les méthodes d'interface sont exposés sur l'objet retourné par l'Exécuteur testamentaire.executor.setRemoveOnCancelPolicy(true);
Si votre
Timer
n'est jamais va avoir une tâche à exécuter alors je suggère de sous-classement:Vous aurez besoin de travailler sur le code pour ajouter des contrôles de la mauvaise utilisation, mais il devrait obtenir ce que vous voulez. Le
ScheduledThreadPoolExecutor
ne semble pas avoir de prise en charge intégrée pour le rééchelonnement des tâches existantes, soit, mais une approche similaire devrait y travaillent ainsi.L'ensemble de l'extrait de Code qui va comme ceci .... J'espère que ce sera de l'aide totale
Avez-vous besoin pour planifier une tâche récurrente? Dans ce cas, je vous recommande de considérer l'utilisation de Quartz.
Je ne pense pas que c'est possible de le faire avec
Timer/TimerTask
, mais selon ce exactement que vous voulez atteindre, vous pourriez être heureux avec l'aide dejava.util.concurrent.ScheduledThreadPoolExecutor
.c'est ce que je suis en train de sortir. J'ai une classe qui interroge une base de données de toutes les 60 secondes à l'aide d'un TimerTask.
dans ma classe principale, je garde l'exemple de la Minuterie, et une instance de ma sous-classe de TimerTask. la classe principale dispose d'une méthode pour définir l'intervalle d'interrogation (dire d'aller de 60 à 30). pour cela, j'ai annuler mon TimerTask (ce qui est mon sous-classe, où je écrasait la méthode cancel() pour faire un peu de ménage, mais qui ne le sont pas) et puis de la rendre nulle. j'ai recréer une nouvelle instance de celle-ci, et le calendrier de la nouvelle instance à la nouvelle fréquence dans l'état actuel de la Minuterie.
depuis la Minuterie n'est pas annulé, le fil c'est à l'aide des séjours actifs (et donc le feriez pour tout autre TimerTasks à l'intérieur), et l'ancien TimerTask est remplacé par un nouveau, qui se trouve être le même, mais VIERGE (depuis l'ancien aurait été exécutées ou prévues, il n'est plus VIERGE, tel que requis pour la planification).
quand je veux l'arrêt de l'ensemble de la minuterie, j'annule et null la TimerTask (même que je l'ai fait lors de la modification du calendrier, encore une fois, de nettoyage des ressources dans mon sous-classe de TimerTask), puis-je annuler et annuler la Minuterie de lui-même.
Voici l'exemple pour Resetable de la Minuterie . Essayer de le modifier pour votre convinence...
Cet exemple imprime la date et l'heure actuelles pour toutes les 5 secondes...Mais si vous donnez de l'entrée dans la console de la minuterie sera retardé pour effectuer la tâche d'entrée...
J'ai fait une classe timer pour un objet analogue; n'hésitez pas à l'utiliser: