85 votes

Comment puis-je planifier une tâche à exécuter à intervalles réguliers?

Je cherche des codes pour mettre en œuvre une tâche planifiée et est venu avec ces codes .

import java.util.*;

class Task extends TimerTask {


    int count = 1;

    // run is a abstract method that defines task performed at scheduled time.
    public void run() {
        System.out.println(count+" : Mahendra Singh");
        count++;
    }
}

class TaskScheduling {

   public static void main(String[] args) {
       Timer timer = new Timer();


       // Schedule to run after every 3 second(3000 millisecond)
       timer.schedule( new Task(), 3000);   
   }
}

Mon résultat :

1  :  Mahendra Singh

Je m'attendais à le compilateur pour imprimer une série de Mahendra Singh périodiques intervalle de 3 s, mais en dépit d'attente d'environ 15 minutes, j'obtiens une seule sortie...Comment puis-je résoudre cela?

88voto

Alexandr Points 1576

ScheduledExecutorService

Je souhaite vous proposer une alternative à la Minuterie à l'aide de - ScheduledThreadPoolExecutor, une mise en œuvre de la ScheduledExecutorService interface. Il a certains avantages par rapport à la classe Timer (de "Java dans la Simultanéité"):

Une Minuterie ne crée qu'un seul thread pour l'exécution de la minuterie tâches. Si une minuterie tâche prend trop de temps à s'exécuter, la précision du timing des autres TimerTasks peuvent en souffrir. Si une récurrents TimerTask est planifiée pour s'exécuter toutes les 10 ms, et un autre Timer-Tâche prend 40 ms pour exécuter la tâche récurrente, soit (selon qu'il a été prévu, à taux fixe ou à taux fixe de retard) est appelée quatre fois en succession rapide après la fin de la tâche, ou "manque" quatre invocations complètement. Prévue pools de threads remédier à cette limitation en vous permettant de fournir de multiples threads pour l'exécution différée et de tâches périodiques.

Un autre problème avec le Timer, c'est qu'il se comporte mal si un TimerTask jette un décoché exception. La Minuterie thread n'a pas intercepter l'exception, donc, un décoché exception générée à partir d'un TimerTask se termine le thread horloge. La minuterie ne pas ressusciter le fil dans cette situation; au lieu de cela, il suppose, à tort, l'ensemble de la Minuterie est annulé. Dans ce cas, TimerTasks qui sont d'ores et déjà prévue mais non encore exécutées ne sont jamais fonctionner, et de nouvelles tâches ne peut pas être programmée. (Ce problème, appelé "fils de fuite").

Et une autre recommandation si vous avez besoin pour construire votre propre service de planification, vous pouvez toujours être en mesure de prendre avantage de la bibliothèque à l'aide d'un DelayQueue, un BlockingQueue de mise en œuvre qui fournit la fonctionnalité de planification de ScheduledThreadPoolExecutor. Un DelayQueue gère une collection de Retard objets. Un Retard a un temps de retard qui lui est associé: DelayQueue vous permet de prendre un élément seulement si le délai a expiré. Les objets retournés à partir d'une DelayQueue commandé par le temps associé à leur retard.

81voto

st0le Points 15318

Utiliser timer.scheduleAtFixedRate

void java.util.Timer.scheduleAtFixedRate(TimerTask task, long delay, long period)

scheduleAtFixedRate
public void scheduleAtFixedRate(TimerTask task,
                                long delay,
                                long period)

Horaires de la tâche spécifiée répétée à taux fixe d'exécution, en commençant après le délai spécifié. Les exécutions suivantes, dans quelque intervalles réguliers, séparés par la période spécifiée. Taux fixe de l'exécution, chaque exécution est prévue par rapport à la date prévue de l'exécution de l'heure de la première exécution. Si l'exécution est retardée pour une raison quelconque (comme la collecte des ordures ou autres activité en arrière-plan), deux ou plusieurs exécutions aura lieu dans la succession rapide pour rattraper leur retard. Dans le long terme, la fréquence d'exécution sera exactement l'inverse de la période spécifiée (en supposant que l'horloge système de l'Objet sous-jacent.attendre(longtemps) est exacte).

Fixe-taux d'exécution est approprié pour les activités récurrentes qui sont sensibles au temps absolu, comme à sonner un carillon toutes les heures sur l'heure, ou l'exécution de la maintenance programmée chaque jour à une heure donnée. Il est aussi approprié pour les activités récurrentes où le temps total nécessaire pour effectuer un nombre fixe d'exécutions est important, comme un compte à rebours que les tiques, une fois par seconde pendant une dizaine de secondes. Enfin, fixe-taux d'exécution est approprié pour la planification de plusieurs répétition de minuterie tâches qui doivent rester synchronisé avec le respect l'un de l'autre.

Paramètres:

  • la tâche la tâche planifiée.
  • délai - délai en millisecondes avant que la tâche est exécutée.
  • période de temps en millisecondes entre chaque tâche d'exécutions.

Jette:

  • IllegalArgumentException - si le retard est négatif, ou de retard + le Système.currentTimeMillis() est négatif.
  • IllegalStateException - si la tâche était déjà prévue ou annulé, la minuterie est annulée, ou de la minuterie thread s'est arrêté.

15voto

yurib Points 2907

public void schedule(TimerTask task, long delay) Horaires de la tâche spécifiée pour l'exécution après l' delay, mais pas régulièrement.

Le troisième paramètre ajouter le comportement que vous voulez avec l' periodparamètre:

public void schedule(TimerTask task, long delay, long period) Horaires de la tâche spécifiée à répétition fixe-délai d'exécution, à compter du spécifiée delay. Les exécutions suivantes, dans quelque intervalles réguliers séparés par la period.

5voto

Enrique Points 4468

Vous pouvez utiliser le Quartz

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X