java计时器任务计划

时间:2010-10-28 15:59:33

标签: java timer scheduling scheduled-tasks

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

我有这段代码:

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

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

我想要这种行为:

  1. 等待60秒。
  2. 做任务一段时间(例如40-100秒)。
  3. 任务完成。
  4. 等待60秒。
  5. 做任务一段时间(例如40-100秒)。
  6. 但上面的代码表现得像这样

    1. 等待60秒。
    2. 做任务一段时间(例如40-100秒)。
    3. 任务完成
    4. 做任务一段时间(例如40-100秒)。
    5. 由于任务的持续时间大于60,因此计时器在任务完成后立即启动任务。但是我想再等一下。

1 个答案:

答案 0 :(得分: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);
        }
    }
}

打印哪些:

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