有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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


共 (1) 个答案

  1. # 1 楼答案

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

    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即可