为什么程序等待schedule()完成但是没有等待scheduleWithFixedDelay()?

时间:2016-07-31 16:17:00

标签: java multithreading concurrency scheduledexecutorservice

以下是代码:

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()不同步执行但是我还没有在文档中找到支持这一点的参数。

1 个答案:

答案 0 :(得分:2)

这有点微妙,但我认为答案在于documentation for shutdown的措辞:

  

启动有序关闭,其中执行先前提交的任务,但不接受任何新任务。

您的第一个任务有资格作为“先前提交的任务”,因此shutdown()会等待它执行。

从技术上讲,重复任务先前已提交,但由于它会永远重复,因此等待它完成是不可能的。试图这样做会违反shutdown()的合同。所以,我想说唯一的选择是忽略未来重复任务的执行。