安排周期性任务和时钟漂移

问题描述 投票:2回答:3

我想安排一个定期任务,每X小时执行一次。我有一个用Java编写的服务,当时我正在考虑创建一个长时间运行的后台线程,只要该服务启动,它就会一直运行。如何确保我们每X个小时执行一次任务?主机上的时钟漂移是我应该担心的问题吗?我知道,如果CPU努力工作,时钟滴答的频率可能会改变。

编辑:我当时正在考虑将一个bean添加到我的spring配置中,以启动将定期执行任务的线程。

java scheduling scheduler clock periodic-task
3个回答
3
投票

Java提供了一个java.util.Timer类,该类旨在在后台线程上执行任务。操作模式之一是“以固定间隔重复执行”。根据您的确切需求,可以使用固定延迟和固定速率执行方法。

Java 5添加了一个比java.util.Timer更灵活的java.util.concurrent.ScheduledThreadPoolExecutor类,但还提供了固定延迟和固定速率执行方法。

如果您需要精确的时间以至于不合适,我不确定Java是否是合适的解决方案。您将开始进入实时系统的领域。此时,您可能应该在寻找其他选项。


0
投票

[如果您担心,编写一个测试过程并在目标平台上运行它。使用您计划用于实际过程的功能(例如java.util.concurrent.ScheduledThreadPoolExecutor),安排任务以每24小时记录一次主机时间。如果主机不使用NTP保持时钟同步,也许您也可以调用计时Web服务并进行记录。几天后,您应该对是否需要一种校正漂移的方法有很好的了解。

我的猜测是内置的调度程序每天的准确度将小于一秒。


0
投票

主机上的时钟漂移是我应该担心的问题吗?

是的,使用Timer时可能会出现时钟漂移。

[ScheduledExecutorService专为防止时钟漂移而设计。

示例用法:

ScheduledThreadPoolExecutor

请参见Javadocs中的CronScheduler

© www.soinside.com 2019 - 2024. All rights reserved.