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

J’étais en train d’essayer des codes pour mettre en œuvre une tâche planifiée et j’ai proposé 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(Ssortingng[] 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 réguliers de 3 secondes, mais malgré une attente d’environ 15 minutes, je n’ai qu’une sortie … Comment résoudre ce problème?

Utiliser timer.scheduleAtFixedRate

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

Planifie la tâche spécifiée pour une exécution répétée à taux fixe, commençant après le délai spécifié. Les exécutions ultérieures ont lieu à intervalles réguliers, séparés par la période spécifiée.
En exécution à taux fixe, chaque exécution est planifiée par rapport à la date d’exécution planifiée de l’exécution initiale. Si une exécution est retardée pour une raison quelconque (comme une récupération de place ou une autre activité en arrière-plan), deux exécutions ou plus se produiront 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 l’exécution de la maintenance planifiée tous les jours à un moment donné. Il est également approprié pour les activités récurrentes où le temps total d’exécution d’un nombre déterminé d’exécutions 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 temporisation répétées qui doivent restr 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.
  • period – temps en millisecondes entre les exécutions de tâches successives.

Jette:

  • IllegalArgumentException – si le délai est négatif ou delay + System.currentTimeMillis () est négatif.
  • IllegalStateException – si la tâche était déjà planifiée ou annulée, le temporisateur a été annulé ou le thread du minuteur s’est terminé.

ScheduledExecutorService

Je souhaite vous proposer une alternative à Timer en utilisant – ScheduledThreadPoolExecutor , une implémentation de l’interface ScheduledExecutorService . Il présente certains avantages par rapport à la classe Timer (à partir de “Java dans la concurrence”):

Un minuteur ne crée qu’un seul thread pour exécuter les tâches du minuteur. Si l’exécution d’une tâche de temporisation est trop longue, la précision de synchronisation des autres TimerTasks peut en souffrir. Si une tâche TimerTask récurrente est planifiée pour s’exécuter toutes les 10 ms et qu’une autre tâche Timer prend 40 ms à exécuter, la tâche récurrente (selon qu’elle a été planifiée à un débit fixe ou fixe) est appelée quatre fois de suite rapidement. La tâche d’exécution se termine ou “échoue” complètement à quatre appels. Les pools de threads programmés répondent à cette limitation en vous permettant de fournir plusieurs threads pour exécuter des tâches différées et périodiques.

Un autre problème avec Timer est qu’il se comporte mal si une TimerTask émet une exception non contrôlée. Le thread Timer n’intercepte pas l’exception, donc une exception non vérifiée lancée à partir d’une TimerTask termine le thread du minuteur. La timer ne ressuscite pas non plus le fil dans cette situation; au lieu de cela, il suppose à tort que la timer entière a été annulée. Dans ce cas, les TimerTasks qui sont déjà planifiés mais pas encore exécutés ne sont jamais exécutés et les nouvelles tâches ne peuvent pas être planifiées. (Ce problème, appelé “fuite de fil”).

Et une autre recommandation si vous devez créer votre propre service de planification, vous pourrez toujours tirer parti de la bibliothèque en utilisant une DelayQueue, une implémentation de BlockingQueue qui fournit la fonctionnalité de planification de ScheduledThreadPoolExecutor. Un DelayQueue gère une collection d’objects Delayed. Un délai est associé à un délai: DelayQueue vous permet de prendre un élément uniquement si son délai a expiré. Les objects sont renvoyés d’une DelayQueue sortingée en fonction de l’heure associée à leur délai.

 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 une exécution répétée à délai fixe , commençant après le délai spécifié. Les exécutions ultérieures ont lieu à intervalles réguliers, séparées par la période spécifiée.

Le planificateur à quartz est également une solution et vous devez tout d’abord créer une classe de travail Quartz.

Le travail de quartz est défini ce que vous voulez 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 Trigger Quartz

Il existe 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 sortinggger = newTrigger().withIdentity("TriggerName", "Group1") .withSchedule(SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(10).repeatForever()).build(); 

CronTrigger – Autorise l’expression cron Unix pour spécifier les dates et heures d’exécution de votre travail.

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

La classe du planificateur relie à la fois Job et Trigger et l’exécute.

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

Exemple complet, vous pouvez voir ici

 timer.scheduleAtFixedRate( new Task(), 1000,3000); 

À cette fin, Java possède la classe Timer et TimerTask mais de quoi s’agit-il?

  • java.util.Timer est une classe d’utilitaire pouvant être utilisée pour planifier l’exécution d’un thread à un moment donné dans le futur. La classe Java Timer peut être utilisée pour planifier une tâche à exécuter une fois ou à exécuter à intervalles réguliers.
  • java.util.TimerTask est une classe abstraite qui implémente l’interface Runnable et nous devons étendre cette classe pour créer notre propre TimerTask qui peut être planifiée à l’aide de la classe java Timer.

Vous pouvez vérifier le tutoriel complet de GeekonJava

 TimerTask timerTask = new MyTimerTask(); //running timer task as daemon thread Timer timer = new Timer(true); timer.scheduleAtFixedRate(timerTask, 0, 10*1000);