scheduleAtFixedRate未在指定的延迟时间启动任务

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

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); scheduler.scheduleAtFixedRate(taskThread,60 ,120 ,TimeUnit.SECONDS); 

发生的事情是第一次taskThread在延迟60秒后没有启动,它在延迟超过60秒后启动。 而接下来的执行以120秒的正确间隔开始(不完全是120秒,但是有一个非常小的延迟,可以忽略)。

我的查询是为什么第一次执行延迟超过60秒? 由于任务由线程执行,启动时间是否取决于线程优先级?

如何让它以60秒的精确延迟运行? Quartz库怎么样? 这个库能解决我的目的吗(在特定时间运行工作没有任何延迟)?

提前致谢。

作业的启动取决于计划的时间和可用的线程数量 – 如果没有可用的线程,则可以延迟。 但是,进一步的执行将在预定时间( delay + n * period )开始 – 这将在您的情况下进行。

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

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

您看到的延迟不太可能是ScheduledExecutorService的错误。 除非你的机器被过度重载,否则启动一个线程不会花费一秒钟,并且我认为如果你使用固定大小的线程池,线程将被预先初始化。

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

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