java计时器任务计划

val*_*674 5 java scheduling timer scheduled-tasks

从Stack Overflow上阅读我发现很多人不建议使用Timer Task.嗯......但我已经实现了这个:

我有这个代码:

detectionHandlerTimer.schedule(myTimerTask, 60 * 1000, 60 * 1000);
Run Code Online (Sandbox Code Playgroud)

问题是myTimerTask的工作持续一段时间.

我想这样的行为:

  1. 等待60秒
  2. 做任务一段时间(例如40-100秒).
  3. 任务完成.
  4. 等待60秒.
  5. 做任务一段时间(例如40-100秒).

但上面的代码表现得像这样

  1. 等待60秒
  2. 做任务一段时间(例如40-100秒).
  3. 任务完成
  4. 做任务一段时间(例如40-100秒).

由于任务的持续时间大于60,因此计时器在任务完成后立即启动任务.但我希望它再次等待.

Rob*_*ska 11

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

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

哪个印刷品:

$ javac TaskManager.java && java TaskManager
1288282514688 Running
1288282529711 Scheduling 10 seconds from now
1288282539712 Running
1288282554713 Scheduling 10 seconds from now
1288282564714 Running
Run Code Online (Sandbox Code Playgroud)

如果您提取时间戳的第二个组件(为清晰起见),它就是这样的:

$ 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
Run Code Online (Sandbox Code Playgroud)

只需用10s 替换60s即可.