gpt4 book ai didi

java - ScheduledThreadPoolExecutor 的任务调度有多准确

转载 作者:搜寻专家 更新时间:2023-10-31 20:00:53 26 4
gpt4 key购买 nike

我正在阅读 ScheduledThreadPoolExecutor JavaDoc并遇到了以下事情:

Delayed tasks execute no sooner than they are enabled, but without any real-time guarantees about when, after they are enabled, they will commence. Tasks scheduled for exactly the same execution time are enabled in first-in-first-out (FIFO) order of submission.

所以,如果我这样写:

ScheduledExecutorService ses = Executors.newScheduledThreadPool(4); //uses ScheduledThreadPoolExecutor internally
Callable<Integer> c;
//initialize c
ses.schedule(c, 10, TimeUnit.SECONDS);

不能保证可调用对象会在调度后 10 秒内开始执行?据我所知,规范允许它甚至在计划后的一小时内执行(没有任何实时保证,如文档中所述)。

它在实践中如何运作?我应该排除一些非常长的延迟吗?

最佳答案

你的理解是正确的。 Executor 并没有声称自己是一个具有任何时间保证的实时系统。它唯一能保证的是它不会过早地运行任务。

在实践中,调整良好的执行器的时间非常准确。根据我的经验,它们通常在预定时间后 10 毫秒内开始。如果您的执行器缺少适当的资源来运行其工作负载,您唯一会看到调度被推迟得很远。所以这更像是一个调整问题。

实际上,如果您为 Executor 提供足够的资源来使用,时间安排将非常准确。


不想使用执行器做的一些事情是将调度用作基于速率的计算的一部分。例如,如果您安排一个任务每 1 秒运行一次并使用它来计算 <somemetric>每秒,而不考虑任务实际运行的时间。

另一件需要注意的事情是上下文切换的成本。如果您安排多个任务每 1 毫秒运行一次,执行器将无法跟上运行您的任务的速度每个 1 毫秒的上下文切换。

关于java - ScheduledThreadPoolExecutor 的任务调度有多准确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34857910/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com