以下是代码:
ScheduledExecutorService service = null;
try {
service = Executors.newSingleThreadScheduledExecutor();
Runnable task1 = () -> System.out.println("Executed only once");
Runnable task2 = () -> System.out.println("Executed repeatedly");
service.schedule(task1, 5, TimeUnit.SECONDS);
service.scheduleWithFixedDelay(task2, 6, 2, TimeUnit.SECONDS);
} finally {
if (service != null) {
service.shutdown();
}
}
执行上面的代码时,程序会等待5秒钟来运行schedule(),但之后它会在不运行scheduleWithFixedDelay()的情况下完成。
我怀疑原因是schedule()与scheduleWithFixedDelay()不同步执行但是我还没有在文档中找到支持这一点的参数。
答案 0 :(得分:2)
这有点微妙,但我认为答案在于documentation for shutdown
的措辞:
启动有序关闭,其中执行先前提交的任务,但不接受任何新任务。
您的第一个任务有资格作为“先前提交的任务”,因此shutdown()会等待它执行。
从技术上讲,重复任务先前已提交,但由于它会永远重复,因此等待它完成是不可能的。试图这样做会违反shutdown()的合同。所以,我想说唯一的选择是忽略未来重复任务的执行。