从Stack Overflow上阅读我已经看到很多人不建议使用Timer Task。嗯......但我已经实现了这个:
我有这段代码:
detectionHandlerTimer.schedule(myTimerTask, 60 * 1000, 60 * 1000);
问题是myTimerTask的工作会持续一段时间。
我想要这种行为:
但上面的代码表现得像这样
由于任务的持续时间大于60,因此计时器在任务完成后立即启动任务。但是我想再等一下。
答案 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。