什么是java.util.Timer固定延迟周期性任务?

时间:2016-08-11 23:42:16

标签: java

这是我正在尝试的代码:

    @Model.Name

输出:

import java.util.Timer;
import java.util.TimerTask;

public class PeriodicTask {

 public static void main (String[] args) {

    System.out.println("Main thread: " + Thread.currentThread());
    Timer timer = new Timer();
    final long start = System.currentTimeMillis();
    timer.schedule(new TimerTask() {
        @Override
        public void run () {
            System.out.print("Timer task invoked in millis: " +
                                             (System.currentTimeMillis()- start));
            System.out.println(" -- "  + Thread.currentThread());
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("task finished "+(System.currentTimeMillis()
                                - start));
        }
    }, 1000,500);
 }
}

根据java.util.Timer文档,提供的时间段应该分隔每个任务执行。所以我期待每个钓鱼任务和新调用的任务应分开500毫秒,例如在第一个任务结束和第二个任务执行开始之间应该是:

Main thread: Thread[main,5,main]
Timer task invoked in millis: 1000 -- Thread[Timer-0,5,main]
task finished 2001
Timer task invoked in millis: 2001 -- Thread[Timer-0,5,main]
task finished 3002
Timer task invoked in millis: 3002 -- Thread[Timer-0,5,main]
task finished 4002
Timer task invoked in millis: 4002 -- Thread[Timer-0,5,main]
......

我错过了什么吗?

我正在使用JDK 1.8

1 个答案:

答案 0 :(得分:0)

分隔每个任务的period不是相对于任务的结束而是相对于它的开始。在Timer过去之后,period会尝试再次安排任务。除非任务仍在运行,否则将在上一个任务完成后立即安排。

在示例中,您为Timer设置了period 500ms。您在sleep() run()方法中调用了1000ms。这意味着Timer想要在半秒后再次安排任务,但是因为前一个任务还有另外半秒才完成。