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

时间:2013-12-04 09:18:58

标签: java multithreading timing scheduledexecutorservice

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

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

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

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

如何让它以60秒的确切延迟运行? Quartz库怎么样?这个库是否会解决我的目的(在特定时间运行工作而不会有任何延迟)?

提前致谢。

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

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

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