2010-10-28 82 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