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?
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:
Jette:
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'autresTimerTask
peut en souffrir. Si unTimerTask
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.
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.
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);
timer.scheduleAtFixedRate( new Task(), 1000,3000);
Pour ce faire Java a la classe Timer et TimerTask mais de quoi s'agit-il?
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);