在特定时间运行java线程

时间:2010-03-13 03:19:38

标签: java multithreading concurrency

我有一个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分钟运行?

3 个答案:

答案 0 :(得分:9)

您可以让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);
        }
    }
}

答案 1 :(得分:2)

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

  

Quartz是一个功能齐全的开源软件   可以的工作调度服务   与侧面集成或一起使用   几乎任何Java EE或Java SE   应用 - 从最小的   独立应用程序最大的   电子商务系统。可以使用石英   创建简单或复杂的计划   执行数十,数百甚至甚至   成千上万的工作;工作的   任务被定义为标准Java   可以虚拟执行的组件   你可以编程要做的任何事情。   Quartz Scheduler包含许多   企业级功能,例如JTA   交易和集群。

答案 2 :(得分:1)

TimerTask处理此案例。

请参阅schedule(TimerTask, Date)

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

相关问题