2010-10-28 65 views
5

從閱讀堆棧溢出我見過,你們許多人不建議使用計時器任務。嗯...但我已經實現了這一點:java計時器任務計劃

我有這樣的代碼:

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

你可以看看彈簧調度功能,或者直接在石英調度程序項目 – 2010-10-28 16:06:10

回答

10

This works。關鍵是讓任務本身(完成後)安排下一次任務的發生。

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 

只是60更換10小號秒。

+0

中做出訣竅tnx。 – vale4674 2010-10-28 21:31:45

+1

是的;當你想重新安排計時器時,我發現了它;需要一個新的timerTask實例。 – sajad 2013-01-17 09:15:51