首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >scheduleAtFixedRate未在指定的延迟启动任务

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

Stack Overflow用户
提问于 2013-12-04 17:18:58
回答 2查看 2.6K关注 0票数 0

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

代码语言:javascript
运行
复制
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(taskThread,60 ,120 ,TimeUnit.SECONDS);

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

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

我怎样才能让它在60秒的精确延迟下运行?那么Quartz库呢?这个库能解决我的问题吗(在特定的时间运行作业,不会有任何延迟)?

提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2013-12-04 18:25:26

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

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

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

票数 0
EN

Stack Overflow用户

发布于 2014-02-12 15:55:54

T.b.h您看到的延迟不太可能是ScheduledExecutorService的错误。

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

如果你愿意,你可以测试一个简单的任务(比如在控制台上写"hello“)来查看。然后,您可以测量任务的每个部分,看看哪些部分花费了很长时间。一旦你有了它,你就可以想出一些方法来“热”你的系统,以防止延迟。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20371319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档