Java scheduleAtFixedRate未以指定的延迟启动任务

Java scheduleAtFixedRate未以指定的延迟启动任务,java,multithreading,timing,scheduledexecutorservice,Java,Multithreading,Timing,Scheduledexecutorservice,我正在使用SchedulerExecuterService在指定的延迟和给定的时间间隔后执行任务 ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); scheduler.scheduleAtFixedRate(taskThread,60 ,120 ,TimeUnit.SECONDS); 发生的情况是taskThread第一次在延迟60秒后没有启动,而是在延迟超过60秒后启动。而下一次执行以120秒的

我正在使用SchedulerExecuterService在指定的延迟和给定的时间间隔后执行任务

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(taskThread,60 ,120 ,TimeUnit.SECONDS);
发生的情况是taskThread第一次在延迟60秒后没有启动,而是在延迟超过60秒后启动。而下一次执行以120秒的正确间隔开始(不完全是120秒,但有一个可以忽略的非常小的延迟)

我的问题是为什么第一次执行会延迟60秒以上?由于任务由线程执行,启动时间是否取决于线程优先级

如何使它以60秒的精确延迟运行?那石英图书馆呢?这个库是否能解决我的目的(在特定时间毫不延迟地运行作业)


提前谢谢

作业的启动取决于计划的时间和可用线程的数量-如果没有可用线程,则可能会延迟。但是,进一步的执行将在计划的时间(
delay+n*period
)开始,这在您的案例中发生

启动将大约在预定时间进行,我怀疑是否有实时保证,这取决于底层操作系统。您可以尝试更改此线程池中某个线程的线程优先级。这可能会有帮助,但不能保证它在不同的环境中工作


您还可以确保为使用的单个线程的固定线程池运行单个任务。或者尝试增加线程数量。

T.b.h.您看到的延迟不太可能是ScheduledExecutorService的错误。启动一个线程不会花费一秒钟的时间,除非你的机器超负荷了,我认为如果你使用一个固定大小的线程池,线程会被提前初始化

我猜这是你自己任务的初始化。我不知道您在任务中正在做什么,但准备好资源(启动DB连接池)等可能需要相当长的时间


如果您愿意,您可以使用一个简单的任务(比如在控制台上写“hello”)进行测试。然后你可以测量任务的每一部分,看看需要多长时间。一旦你有了它,你可以想办法“加热”你的系统以防止延迟。

石英库呢?这有可能吗?不要搞乱JVM中的线程优先级,它通常会让事情变得更糟。至于实时保证,普通JVM没有,但有一些特殊的JVM可以(但您不想使用它们)。