2010-10-28 31 views
5

Odczytywanie w przepełnieniu stosu Widziałem, że wielu z was nie zaleca używania zadania timera. Hmmm ... ale ja już wdrożone następująco:harmonogram zadań timera java

mam ten kod:

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

Chodzi o to, że praca myTimerTask trwa trochę czasu.

Chciałbym to zachowanie:

  1. czekać 60 sek.
  2. wykonać zadanie przez pewien czas (na przykład 40 - 100 sekund).
  3. zadanie zakończone.
  4. odczekaj 60 sekund.
  5. wykonać zadanie przez pewien czas (na przykład 40 - 100 sekund).

Ale powyższy kod zachowuje się tak

  1. czekać 60 sek.
  2. wykonać zadanie przez pewien czas (na przykład 40 - 100 sekund).
  3. zadanie zakończone
  4. robienie zadania przez pewien czas (na przykład 40 - 100 sekund).

Ponieważ czas trwania zadania jest większy niż 60, timer uruchamia zadanie natychmiast po zakończeniu zadania. Ale chciałbym, żeby znów poczekało.

+1

Możesz rzucić okiem na możliwości planowania wiosennego lub bezpośrednio w projekcie harmonogramu kwarcu –

Odpowiedz

10

To działa. Kluczem jest, aby samo zadanie (po jego zakończeniu) zaplanować następne wystąpienie zadania.

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

która drukuje:

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

Oto jak to wygląda jeśli wyodrębnić drugi składnik znaczników czasu (dla jasności):

$ 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 

Wystarczy wymienić 10 S z 60 s.

+0

, który zrobił lewę, tnx. – vale4674

+1

Tak; Dowiedziałem się, kiedy chcesz zmienić harmonogram czasomierza; potrzebne jest nowe wystąpienie timeraTask. – sajad

Powiązane problemy