在特定时间运行java线程

我有一个Web应用程序,每小时四次与中央数据库同步。 这个过程通常需要2分钟。 我想将此过程作为线程在X:55,X:10,X:25和X:40运行,以便用户知道在X:00,X:15,X:30和X:45他们有一个干净的数据库副本。 这只是关于管理期望。 我已经通过了java.util.concurrent的执行程序,但调度是使用scheduleAtFixedRate完成的,我相信这并不能保证何时实际按小时运行。 我可以使用第一个延迟启动Runnable以便第一个延迟接近启动时间和每15分钟的时间表,但似乎这可能会在时间上发生分歧。 是否有更简单的方法来安排线程在每个季度之前5分钟运行?

您可以让Runnable计划“下次运行”。

如,

 class Task implements Runnable { private final ScheduledExecutorService service; public Task(ScheduledExecutorService service){ this.service = service; } public void run(){ try{ //do stuff }finally{ //Prevent this task from stalling due to RuntimeExceptions. long untilNextInvocation = //calculate how many ms to next launch service.schedule(new Task(service),untilNextInvocation,TimeUnit.MILLISECONDS); } } } 

Quartz非常适合,因为你的应用程序是基于网络的。 它将提供您需要的细粒度时间安排。

Quartz是一个function齐全的开源作业调度服务,可以与几乎任何Java EE或Java SE应用程序集成或一起使用 – 从最小的独立应用程序到最大的电子商务系统。 Quartz可用于创建简单或复杂的计划,以执行数十,数百甚至数万个作业; 任务被定义为标准Java组件的作业,可以执行几乎任何您可以编程的任务。 Quartz Scheduler包含许多企业级function,例如JTA事务和集群。

TimerTask处理这种情况。

查看时间表(TimerTask,Date)

如果您不想继续安排作业,您可能需要查看Quartz等作业调度工具。