Come posso programmare un’attività da eseguire a intervalli periodici?

Stavo cercando alcuni codici per implementare un’attività pianificata e ho trovato questi codici.

import java.util.*; class Task extends TimerTask { int count = 1; // run is a abstract method that defines task performsd 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); } } 

La mia uscita:

 1 : Mahendra Singh 

Mi aspettavo che il compilatore stampasse una serie di Mahendra Singh a intervalli di 3 secondi, ma nonostante l’attesa per circa 15 minuti, ottengo solo una uscita … Come posso risolvere questo problema?

Utilizza timer.scheduleAtFixedRate

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

Pianifica l’attività specificata per l’esecuzione a tasso fisso ripetuto, iniziando dopo il ritardo specificato. Le esecuzioni successive hanno luogo a intervalli regolari, separati dal periodo specificato.
Nell’esecuzione a tasso fisso, ogni esecuzione è pianificata in relazione al tempo di esecuzione pianificato dell’esecuzione iniziale. Se un’esecuzione viene ritardata per qualsiasi motivo (come la garbage collection o altre attività in background), due o più esecuzioni si verificano in rapida successione per “recuperare”. Nel lungo periodo, la frequenza di esecuzione sarà esattamente la reciproca del periodo specificato (supponendo che l’orologio di sistema sottostante Object.wait (long) sia accurato).

L’esecuzione a tasso fisso è appropriata per le attività ricorrenti sensibili al tempo assoluto, ad esempio suonando un campanello ogni ora all’ora o eseguendo la manutenzione pianificata ogni giorno in un determinato momento. È inoltre appropriato per attività ricorrenti in cui è importante il tempo totale per eseguire un numero fisso di esecuzioni, ad esempio un timer per il conto alla rovescia che spunta una volta al secondo per dieci secondi. Infine, l’esecuzione a tasso fisso è appropriata per la pianificazione di più attività del timer ripetuto che devono rimanere sincronizzate l’una rispetto all’altra.

parametri:

  • compito: compito da pianificare.
  • ritardo: ritardo in millisecondi prima che l’attività venga eseguita.
  • periodo – tempo in millisecondi tra le successive esecuzioni delle attività.

Produce:

  • IllegalArgumentException – se il ritardo è negativo o il ritardo + System.currentTimeMillis () è negativo.
  • IllegalStateException: se l’attività era già programmata o annullata, il timer è stato annullato o il thread del timer è stato interrotto.

ScheduledExecutorService

Desidero offrirti un’alternativa a Timer usando – ScheduledThreadPoolExecutor , un’implementazione dell’interfaccia ScheduledExecutorService . Ha alcuni vantaggi rispetto alla class Timer (da “Java in Concurrency”):

Un timer crea solo un singolo thread per l’esecuzione delle attività del timer. Se un’attività timer richiede troppo tempo per essere eseguita, la precisione temporale di altri TimerTask può risentirne. Se un TimerTask ricorrente è pianificato per essere eseguito ogni 10 ms e un altro Timer-Task richiede 40 ms per essere eseguito, l’operazione ricorrente (a seconda che sia stata programmata a tasso fisso o a ritardo fisso) viene chiamata quattro volte in rapida successione dopo il lungo l’attività di esecuzione completa o “manca” completamente quattro invocazioni. I pool di thread pianificati risolvono questa limitazione consentendo di fornire più thread per l’esecuzione di attività differite e periodiche.

Un altro problema con Timer è che si comporta male se un TimerTask genera un’eccezione non controllata. Il thread Timer non rileva l’eccezione, quindi un’eccezione non controllata generata da un TimerTask termina il thread del timer. Anche il timer non resuscita il thread in questa situazione; invece, assume erroneamente l’annullamento dell’intero Timer. In questo caso, i TimerTasks già pianificati ma non ancora eseguiti non vengono mai eseguiti e non è ansible pianificare nuove attività. (Questo problema, chiamato “thread leakage”).

E un’altra raccomandazione se è necessario creare il proprio servizio di pianificazione, si può ancora essere in grado di sfruttare la libreria utilizzando una DelayQueue, un’implementazione BlockingQueue che fornisce la funzionalità di pianificazione di ScheduledThreadPoolExecutor. Un DelayQueue gestisce una raccolta di oggetti Ritardati. A Delayed è associato un ritardo: DelayQueue consente di prendere un elemento solo se il suo ritardo è scaduto. Gli oggetti vengono restituiti da un valore DelayQueue ordinato dall’orario associato al loro ritardo.

 public void schedule(TimerTask task,long delay) 

Pianifica l’attività specificata per l’esecuzione dopo il ritardo specificato.

tu vuoi:

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

Pianifica l’attività specificata per l’esecuzione ripetuta del ritardo fisso , che inizia dopo il ritardo specificato. Le esecuzioni successive hanno luogo a intervalli regolari circa separati dal periodo specificato.

Il programma di pianificazione al quarzo è anche una soluzione e in primo luogo si realizza la class Quartz Job.

Il lavoro al quarzo è definito ciò che si desidera eseguire

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

Ora devi fare Quartz Trigger

Ci sono due tipi di trigger in Quarzo

SimpleTrigger : consente di impostare l’ora di inizio, l’ora di fine e l’intervallo di ripetizione.

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

CronTrigger – Consente all’espressione cron Unix di specificare le date e le ore per eseguire il lavoro.

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

La class Scheduler collega insieme Job e Trigger e la esegue.

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

Esempio completo che puoi vedere qui

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

A questo scopo, Java ha una class Timer e TimerTask ma di cosa si tratta?

  • java.util.Timer è una class di utilità che può essere utilizzata per pianificare un thread da eseguire in un determinato momento in futuro. La class Java Timer può essere utilizzata per pianificare un’attività da eseguire una volta sola o da eseguire a intervalli regolari.
  • java.util.TimerTask è una class astratta che implementa l’interfaccia Runnable e dobbiamo estendere questa class per creare il nostro TimerTask che può essere pianificato utilizzando la class java Timer.

Puoi controllare il tutorial completo da GeekonJava

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