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,因此计时器在任务完成后立即启动任务。 但我希望它再次等待。

这很有效。 关键是让任务本身(在完成之后)安排下一次出现的任务。

 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秒。