2010-10-28 6 views
5

Из чтения переполнения стека Я видел, что многие из вас не рекомендуют использовать задачу таймера. Хммм ... но я уже реализовали это:java timer task schedule

У меня есть этот код:

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

Дело в том, что работа myTimerTask длится некоторое время.

Я хотел бы это поведение:

  1. ждать 60 сек.
  2. выполняйте задачу в течение некоторого времени (например, 40-100 секунд).
  3. задача закончена.
  4. подождите 60 секунд.
  5. выполняйте задачу в течение некоторого времени (например, 40-100 секунд).

Но приведенный выше код ведет себя так

  1. ждать 60 сек.
  2. выполняйте задачу в течение некоторого времени (например, 40-100 секунд).
  3. Задача завершена
  4. выполнить задачу в течение некоторого времени (например, 40-100 секунд).

Поскольку время выполнения задачи больше 60, таймер запускает задачу сразу же после завершения задачи. Но я бы хотел, чтобы он снова подождал.

+1

Вы можете взглянуть на функции планирования весны или непосредственно в проекте планировщика кварца –

ответ

10

Это работает. Ключ состоит в том, чтобы сама задача (после ее завершения) планировала следующее возникновение задачи.

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

который печатает:

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

Вот что это выглядит, как если бы вы извлечь вторые компоненты временных меток (для ясности):

$ 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 

Просто замените 10 с с 60 s.

+0

, который сделал трюк, tnx. – vale4674

+1

Да; Я узнал, когда вы хотите перенести таймер; необходим новый экземпляр timerTask. – sajad