0

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

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

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

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

如何让它以 60 秒的精确延迟运行?Quartz 库呢?这个库会解决我的目的吗(在特定时间运行作业,不会有任何延迟)?

提前致谢。

4

2 回答 2

0

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

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

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

于 2013-12-04T10:25:25.537 回答
0

您看到的延迟不太可能是 ScheduledExecutorService 的错。除非您的机器超载得离谱,否则启动线程不会花费一秒钟,而且我认为如果您使用固定大小的线程池,线程无论如何都会预先初始化。

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

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

于 2014-02-12T07:55:53.573 回答