2010-12-28 11 views
68

Stavo cercando alcuni codici per implementare un'attività pianificata e ho trovato questi codici.Come pianificare un'attività da eseguire a intervalli periodici?

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

La mia uscita:

1 : Mahendra Singh 

mi aspettavo che il compilatore di stampare una serie di Mahendra Singh a intervalli periodici di 3 s ma nonostante attesa di circa 15 minuti, ho una sola uscita ... Come risolvo questo?

+0

** Utilità di pianificazione al quarzo ** per aiutare l'applicazione Java a pianificare un lavoro/un'attività da eseguire in una data e un'ora specificate [controllare l'esempio completo di ciò] (http://geekonjava.blogspot.com/2015/05/how -to-scheduling-job-in-java-via.html) – GeekOnJava

risposta

58

Usa timer.scheduleAtFixedRate

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

Orari l'attività specificata per l'esecuzione a tasso fisso ripetuto, a partire dopo il ritardo specificato. Le esecuzioni successive hanno luogo a intervalli regolari, separati dal periodo specificato.
Nell'esecuzione a velocità fissa, 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 attività ricorrenti sensibili al tempo assoluto, ad esempio suonando una suoneria ogni ora all'ora o eseguendo la manutenzione programmata 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 per essere programmato.
  • ritardo - ritardo in millisecondi prima che l'attività venga eseguita.
  • periodo - tempo in millisecondi tra le successive esecuzioni di attività.

Produce:

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

scheduleAtFixedRate non risolve il problema di ottenere l'output solo una volta. –

+0

@ JamesA.N.Stauffer, ha bisogno dell'output ripetutamente, non una volta. – st0le

+1

Sì, ma la ripetizione si ottiene semplicemente aggiungendo un terzo argomento: la modifica del metodo non è necessaria. –

12
public void schedule(TimerTask task,long delay) 

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

si desidera:

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

Orari l'attività specificata per ripetute-ritardo fisso esecuzione, a partire dopo il ritardo specificato. Le esecuzioni successive hanno luogo a intervalli regolari circa separati dal periodo specificato.

3

È possibile utilizzare Quartz

+20

-1 Ancora un'altra libreria necessaria solo per un'attività di base che può essere eseguita con il framework esistente. sì il quarzo può fare di più, ma non è utile nel contesto di questa domanda – JDC

+2

@ JDC: Perché reinventare la ruota! –

+0

Sono d'accordo con i commenti sopra, ma direi che sarebbe ancora una risposta OK se ha dato un esempio. Le regole SO dicono che un link non è una risposta. Questo dovrebbe essere un commento. –

65

ScheduledExecutorService

desidero offrire un'alternativa ai timer utilizzando - ScheduledThreadPoolExecutor, l'implementazione dell'interfaccia ScheduledExecutorService. Ha alcuni vantaggi rispetto alla classe 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 è possibile pianificare nuove attività. (Questo problema, chiamato "thread leakage").

E un altro consiglio 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.

+2

Un altro problema con il timer è che, cambiando l'orologio di sistema, non funziona con il timer – rajath

0

Per questo scopo Java ha una classe Timer e TimerTask ma che cos'è?

  • java.util.Timer è una classe di utilità che può essere utilizzato per programmare un filo da eseguire a determinato tempo in futuro. La classe Java Timer può essere da utilizzare per pianificare un'attività da eseguire una volta sola o da eseguire a intervalli regolari .
  • java.util.TimerTask è una classe astratta che implementa interfaccia Runnable e abbiamo bisogno di estendere questa classe per creare la nostra TimerTask che può essere programmato utilizzando classe Java Timer.

È possibile controllare completo tutorial da GeekonJava

TimerTask timerTask = new MyTimerTask(); 

//running timer task as daemon thread 

Timer timer = new Timer(true); 

timer.scheduleAtFixedRate(timerTask, 0, 10*1000); 
3

quarzo scheduler è anche una soluzione e in primo luogo si fanno di classe al quarzo di lavoro.

quarzo lavoro si definisce 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 è necessario fare quarzo trigger

Ci sono due tipi di trigger in quarzo

SimpleTrigger - Permette di impostare l'ora di inizio, l'ora di fine, l'intervallo di ripetizione.

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

CronTrigger - permette l'espressione cron Unix per specificare le date e gli orari per eseguire il tuo lavoro.

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

link Class Scheduler sia lavoro e trigger insieme ed eseguirlo.

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

Full Example you can see here

1

timer.scheduleAtFixedRate (Nuova operazione(), 1000,3000);

Problemi correlati