2010-10-28 7 views
5

Dalla lettura su Stack Overflow ho visto che molti di voi non consigliano di utilizzare Timer Task. Hmmm ... ma ho già implementato questo:pianificazione attività timer java

ho questo codice:

detectionHandlerTimer.schedule(myTimerTask, 60 * 1000, 60 * 1000); 

Il fatto è che il lavoro di myTimerTask dura un po 'di tempo.

Vorrei che questo comportamento:

  1. attendere 60 sec.
  2. eseguire l'attività per un po 'di tempo (ad es. 40 - 100 sec).
  3. attività terminata.
  4. attendere 60 secondi.
  5. eseguire l'attività per un po 'di tempo (ad es. 40 - 100 sec).

Ma il codice di cui sopra si comporta in questo modo

  1. attendere 60 sec.
  2. eseguire l'attività per un po 'di tempo (ad es. 40 - 100 sec).
  3. attività terminata
  4. eseguire l'attività per un certo periodo di tempo (ad esempio 40 - 100 sec).

Poiché la durata dell'attività è superiore a 60, il timer avvia l'attività immediatamente dopo il completamento dell'attività. Ma mi piacerebbe aspettare ancora.

+1

è possibile dare un'occhiata alle funzionalità di pianificazione di primavera o direttamente nel progetto di pianificazione quarzo –

risposta

10

Questo funziona. La chiave è di avere l'attività stessa (dopo il completamento) pianificare l'occorrenza successiva dell'attività.

import java.util.Timer; 
import java.util.TimerTask; 

public class TaskManager { 

    private Timer timer = new Timer(); 

    public static void main(String[] args) { 
     TaskManager manager = new TaskManager(); 
     manager.startTask(); 
    } 

    public void startTask() { 
     timer.schedule(new PeriodicTask(), 0); 
    } 

    private class PeriodicTask extends TimerTask { 
     @Override 
     public void run() { 
      System.out.println(System.currentTimeMillis() + " Running"); 

      /* replace with the actual task */ 
      try { 
       Thread.sleep(15 * 1000); 
      } catch(InterruptedException e) { 
       e.printStackTrace(); 
      } 
      /* end task processing */ 

      System.out.println(System.currentTimeMillis() + " Scheduling 10 seconds from now"); 
      timer.schedule(new PeriodicTask(), 10 * 1000); 
     } 
    } 
} 

che stampa:

$ javac TaskManager.java && java TaskManager 
1288282514688 Running 
1288282529711 Scheduling 10 seconds from now 
1288282539712 Running 
1288282554713 Scheduling 10 seconds from now 
1288282564714 Running 

Ecco quello che sembra, se si estrae il secondo componenti dei timestamp (per chiarezza):

$ javac TaskManager.java && java TaskManager 
14         Running 
29 (+15 seconds execution)   Scheduling 10 seconds from now 
39 (+10 seconds delay until next run) Running 
54 (+15 seconds execution)   Scheduling 10 seconds from now 
64 (+10 seconds delay until next run) Running 

basta sostituire il 10 s con 60 S.

+0

che ha fatto il trucco, tnx. – vale4674

+1

Sì; Ho scoperto quando vuoi riprogrammare il timer; è necessaria una nuova istanza di timerTask. – sajad