java定时器任务计划

标签 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 秒)。

但是上面的代码是这样的

  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

只需将 10 替换为 60

关于java定时器任务计划,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4044729/

相关文章:

java - 使用 Apache Ignite,在启用 TTL 且线程执行后,一些过期数据仍保留在内存中

java - Android 应用程序在主 Activity 启动时强制崩溃

当循环位于timer1_Tick函数内部时C#错误

java - 暂停 Swing GUI

scheduling - GNU make中的互斥作业调度?

java - 如何解压包含子目录的 zip 存档?

java - SOAPUI 4.5.1 无法生成 DH key 对

ios - 如何正确删除 Timer 实例

Jenkins - SVN 中存在更改,但 Jenkins 未显示任何更改,但构建正在运行

linux - 限制 CPU 调度