代码之家  ›  专栏  ›  技术社区  ›  Ricardo Marimon

在特定时间运行Java线程

  •  7
  • Ricardo Marimon  · 技术社区  · 14 年前

    我有一个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 回复  |  直到 11 年前
        1
  •  9
  •   Enno Shioji    14 年前

    你可以让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);
            }
        }
    }
    
        2
  •  2
  •   Taylor Leese    14 年前

    Quartz 很适合,因为你的应用程序是基于web的。它将提供所需的细粒度基于时间的调度。

    quartz是一个功能齐全的开源软件 作业调度服务,可以是 与侧面结合或沿侧面使用 几乎任何Java EE或Java SE 应用程序-从最小的 独立应用程序 电子商务系统。可使用石英 创建简单或复杂的计划 执行数十,数百,甚至 数以万计的工作 任务定义为标准Java 可以虚拟执行的组件 你可以让他们做任何事情。 quartz调度程序包括许多 企业级特性,如jta 事务和群集。

        3
  •  1
  •   LaLeX    11 年前

    TimerTask 处理这个案子。

    schedule(TimerTask, Date)

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