如何在Java中安排定期任务?

我需要安排一个任务在固定的时间间隔运行。 我怎样才能做到这一点,支持很长的时间间隔(例如每8小时)?

我目前正在使用java.util.Timer.scheduleAtFixedRatejava.util.Timer.scheduleAtFixedRate是否支持长时间间隔?

使用ScheduledExecutorService :

  private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); scheduler.scheduleAtFixedRate(yourRunnable, 8, 8, TimeUnit.HOURS); 

你应该看看Quartz这是一个Java EE框架,适用于EE和SE版本,并允许定义作业来执行特定的时间

试试这个方法 – >

首先创build一个运行你的任务的类TimeTask,它看起来像:

  public class CustomTask extends TimerTask { public CustomTask(){ //Constructor } public void run() { try { // Your task process } catch (Exception ex) { System.out.println("error running thread " + ex.getMessage()); } } 

然后在主类中实例化任务,并按指定date定期运行它:

  public void runTask(){ Calendar calendar = Calendar.getInstance(); calendar.set( Calendar.DAY_OF_WEEK, Calendar.MONDAY ); calendar.set(Calendar.HOUR_OF_DAY, 15); calendar.set(Calendar.MINUTE, 40); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); Timer time = new Timer(); // Instantiate Timer Object // Start running the task on Monday at 15:40:00, period is set to 8 hours // if you want to run the task immediately, set the 2nd parameter to 0 time.schedule(new CustomTask(), calendar.getTime(), TimeUnit.HOURS.toMillis(8)); } 

如果你想坚持使用java.util.Timer ,你可以用它来安排大的时间间隔。 你只是通过你正在拍摄的时期。 在这里检查文档。

使用Google Guava AbstractScheduledService ,如下所示:

 public class ScheduledExecutor extends AbstractScheduledService { @Override protected void runOneIteration() throws Exception { System.out.println("Executing...."); } @Override protected Scheduler scheduler() { return Scheduler.newFixedRateSchedule(0, 3, TimeUnit.SECONDS); } @Override protected void startUp() { System.out.println("StartUp Activity...."); } @Override protected void shutDown() { System.out.println("Shutdown Activity..."); } public static void main(String[] args) throws InterruptedException { ScheduledExecutor se = new ScheduledExecutor(); se.startAsync(); Thread.sleep(15000); se.stopAsync(); } 

}

如果你有更多这样的服务,那么在ServiceManager中注册所有服务将会很好,因为所有的服务可以一起启动和停止。 在这里阅读更多关于ServiceManager。

如果您的应用程序已经在使用Spring框架,那么您已经安装了Scheduling

我使用Spring框架的function。 ( 春季上下文 jar或maven依赖)。

 import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component public class ScheduledTaskRunner { @Autowired @Qualifier("TempFilesCleanerExecution") private ScheduledTask tempDataCleanerExecution; @Scheduled(fixedDelay = TempFilesCleanerExecution.INTERVAL_TO_RUN_TMP_CLEAN_MS /* 1000 */) public void performCleanTempData() { tempDataCleanerExecution.execute(); } } 

ScheduledTask是我自己的接口与我自定义的方法执行 ,我称之为我的计划任务。