我正在使用SchedulerExecuterService在指定的延迟和指定的时间间隔执行任务。
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(taskThread,60 ,120 ,TimeUnit.SECONDS);
发生的情况是第一次taskThread在延迟60秒后没有启动,它在延迟超过60秒后启动。而下一次执行以120秒的正确间隔开始(不是确切的120秒,但有一个可以忽略的非常微小的延迟)。
我的疑问是,为什么第一次执行会延迟超过60秒?由于任务是由线程执行的,那么启动时间是否取决于线程优先级?
我怎样才能让它在60秒的精确延迟下运行?那么Quartz库呢?这个库能解决我的问题吗(在特定的时间运行作业,不会有任何延迟)?
提前谢谢。
发布于 2013-12-04 18:25:26
作业的启动取决于计划的时间和可用的线程数量-如果没有可用的线程,则可以延迟。但是,进一步的执行将在计划的时间(delay + n * period
)开始-这在您的情况下发生。
启动将大约在预定的时间发生,我怀疑这是否有实时保证,这取决于底层操作系统。您可以尝试更改此线程池中某个线程的线程优先级。这可能会有所帮助,但它不能保证它在不同的环境中都能正常工作。
您还可以确保为您使用的单个线程的固定线程池运行单个任务。或者尝试增加线程数量。
发布于 2014-02-12 15:55:54
T.b.h您看到的延迟不太可能是ScheduledExecutorService的错误。
我猜这是你自己的任务的初始化。我不知道您在任务中做了什么,但是准备好资源(启动DB连接池)等可能会占用大量时间。
如果你愿意,你可以测试一个简单的任务(比如在控制台上写"hello“)来查看。然后,您可以测量任务的每个部分,看看哪些部分花费了很长时间。一旦你有了它,你就可以想出一些方法来“热”你的系统,以防止延迟。
https://stackoverflow.com/questions/20371319
复制相似问题