按照接口文档,schedule方法会以特定的延迟执行任务,相当于在前一个任务完成时,再delay一段时间执行下一个任务。
@Test
public void test2() {
Timer timer = new Timer(true);
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("start");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("end");
}
}, 0, 5000);
while (true) {
}
}
那这个代码,上一次输出start end后,下一个start不应该延迟5s再输出吗?可实际运行,输出end后总是立刻输出了start,感觉不太对啊。
因为你task的运行时间超过了timer的周期,核心源码在这:
taskFired 的判断条件是 executionTime<=currentTime,你的这种情况是true,接下来任务就直接run了: