web-dev-qa-db-fra.com

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

J'essayais des codes pour mettre en œuvre une tâche planifiée et je les ai trouvés.

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);   
   }
}

Ma sortie:

1  :  Mahendra Singh

Je m'attendais à ce que le compilateur imprime une série de Mahendra Singh à intervalles de 3 s, mais malgré l'attente d'environ 15 minutes, je ne reçois qu'une sortie ... Comment résoudre ce problème?

73
Vimal Basdeo

Utilisation timer.scheduleAtFixedRate

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

Planifie la tâche spécifiée pour l'exécution répétée à débit fixe, commençant après le délai spécifié. Les exécutions ultérieures ont lieu à intervalles réguliers environ, séparés par la période spécifiée.
Dans une exécution à taux fixe, chaque exécution est planifiée par rapport au temps d'exécution planifié de l'exécution initiale. Si une exécution est retardée pour une raison quelconque (telle que le ramassage des ordures ou une autre activité en arrière-plan), deux exécutions ou plus se succèdent rapidement pour "rattraper". À 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 sous-jacente à Object.wait (long) est exacte).

L'exécution à taux fixe est appropriée pour les activités récurrentes sensibles au temps absolu, telles que la sonnerie d'un carillon toutes les heures ou la maintenance programmée tous les jours à une heure donnée. Il convient également aux activités récurrentes pour lesquelles le temps total nécessaire pour effectuer un nombre d'exécutions fixe est important, comme un compte à rebours qui se déclenche une fois par seconde pendant dix secondes. Enfin, l’exécution à débit fixe est appropriée pour la planification de plusieurs tâches de minuterie répétitives qui doivent rester synchronisées les unes par rapport aux autres.

Paramètres:

  • tâche - tâche à planifier.
  • delay - délai en millisecondes avant l'exécution de la tâche.
  • période - temps en millisecondes entre les exécutions de tâches successives.

Jette:

  • IllegalArgumentException - si delay est négatif ou delay + System.currentTimeMillis () est négatif.
  • IllegalStateException - si la tâche a déjà été planifiée ou annulée, le minuteur a été annulé ou le thread du minuteur s'est terminé.
69
st0le

Avantage de ScheduledExecutorService sur Timer

Je souhaite vous proposer une alternative à Timer avec - ScheduledThreadPoolExecutor , une implémentation de l'interface ScheduledExecutorService . Il présente certains avantages par rapport à la classe Timer, selon "Java in Concurrency":

Un Timer ne crée qu'un seul thread pour l'exécution des tâches du minuteur. Si une tâche de minuterie prend trop de temps à s'exécuter, la précision du minutage d'autres TimerTask peut en souffrir. Si un TimerTask récurrent est programmé pour s'exécuter toutes les 10 ms et qu'un autre Timer-Task prend 40 ms, la tâche récurrente soit (selon qu'elle a été programmée à débit fixe ou à retard fixe) est appelée quatre fois dans succession rapide après la tâche longue, ou "manque" quatre invocations complètement. Les pools de threads planifiés répondent à cette limitation en vous permettant de fournir plusieurs threads pour l'exécution de tâches différées et périodiques.

Un autre problème avec Timer est qu’il se comporte mal si un TimerTask lève une exception non contrôlée . Aussi appelé "fuite de fil"

Le thread du minuteur n'intercepte pas l'exception, donc une exception non contrôlée levée depuis un TimerTask termine le thread du minuteur. Le minuteur ne ressuscite pas non plus le fil dans cette situation; au lieu de cela, il suppose à tort que la minuterie entière a été annulée. Dans ce cas, les tâches Timer déjà planifiées mais non encore exécutées ne sont jamais exécutées et les nouvelles tâches ne peuvent pas être planifiées.

Et une autre recommandation si vous devez créer votre propre service de planification, vous pourrez peut-être tirer parti de la bibliothèque en utilisant une implémentation DelayQueue, une BlockingQueue qui fournit la fonctionnalité de planification de ScheduledThreadPoolExecutor. Un DelayQueue gère une collection d'objets retardés. Un délai est associé à un délai: DelayQueue ne vous permet de prendre un élément que si son délai a expiré. Les objets sont retournés à partir d'un DelayQueue ordonné par le temps associé à leur retard.

74
Alexandr
public void schedule(TimerTask task,long delay)

Planifie l'exécution de la tâche spécifiée après le délai spécifié.

tu veux:

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

Planifie la tâche spécifiée pour l'exécution délai fixe répété, commençant après le délai spécifié. Les exécutions ultérieures ont lieu à intervalles réguliers environ, séparés par la période spécifiée.

14
yurib

Le programmateur Quartz est également une solution et vous commencez par créer une classe de travail Quartz.

Le travail Quartz définit ce que vous souhaitez exécuter.

package com.blogspot.geekonjava.quartz;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
public class QuartzJob implements Job {
        public void execute(JobExecutionContext context)
                        throws JobExecutionException {
                JobKey jobKey = context.getJobDetail().getKey();
                System.out.println("Quartz" + "Job Key " + jobKey);
        }
}

Maintenant, vous devez faire un déclencheur à quartz

Il y a deux types de déclencheurs dans Quartz

SimpleTrigger - Permet de définir l'heure de début, l'heure de fin, l'intervalle de répétition.

Trigger trigger = newTrigger().withIdentity("TriggerName", "Group1")
                .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInSeconds(10).repeatForever()).build();

CronTrigger - Permet à l'expression Unix cron de spécifier les dates et heures d'exécution de votre travail.

Trigger trigger = newTrigger()
                .withIdentity("TriggerName", "Group2")
                .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?")).build();

La classe Scheduler relie le travail et le déclencheur et l'exécute.

Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.start();
scheduler.scheduleJob(job, trigger);

Exemple complet, vous pouvez voir ici

4
Tell Me How
timer.scheduleAtFixedRate( new Task(), 1000,3000); 
2
Brijesh

Pour ce faire Java a la classe Timer et TimerTask mais de quoi s'agit-il?

  • Java.util.Timer est une classe d’utilitaires qui peut être utilisée pour planifier l’exécution d’un thread à un moment donné à l’avenir. Java La classe Timer peut être utilisée pour planifier l'exécution ponctuelle ou unique d'une tâche.
  • Java.util.TimerTask est une classe abstraite qui implémente l'interface Runnable. Nous devons étendre cette classe pour créer notre propre tâche de minuterie pouvant être planifiée à l'aide de Java Classe de minuterie.

Vous pouvez consulter le tutoriel complet depuis GeekonJava

TimerTask timerTask = new MyTimerTask();

//running timer task as daemon thread

Timer timer = new Timer(true);

timer.scheduleAtFixedRate(timerTask, 0, 10*1000);
1
Tell Me How