2016-08-18 88 views
0

我想在特定时间安排某个特定日期的任务。每次运行之间的时间间隔可以设置为1到12个月。在java中,可以使用ScheduledExecutorService以固定的时间间隔调度任务。由于一个月的天数不固定,如何实现?使用ScheduledExecutorService计划每月任务

在此先感谢。

回答

1

如果您在Java EE环境中运行的是,你应该使用TimerService@Schedule注解。但是由于您正在讨论ScheduledExecutorService,在Java EE容器中不允许使用它们,我假设您没有运行在一个Java EE容器中。

当使用ScheduledExecutorService的,你可以有任务本身安排下一次迭代:早于8

final ScheduledExecutorService executor = /* ... */ ; 

Runnable task = new Runnable() { 
    @Override 
    public void run() { 
     ZonedDateTime now = ZonedDateTime.now(); 
     long delay = now.until(now.plusMonths(1), ChronoUnit.MILLIS); 

     try { 
      // ... 
     } finally { 
      executor.schedule(this, delay, TimeUnit.MILLISECONDS); 
     } 
    } 
}; 

int dayOfMonth = 5; 

ZonedDateTime dateTime = ZonedDateTime.now(); 
if (dateTime.getDayOfMonth() >= dayOfMonth) { 
    dateTime = dateTime.plusMonths(1); 
} 
dateTime = dateTime.withDayOfMonth(dayOfMonth); 
executor.schedule(task, 
    ZonedDateTime.now().until(dateTime, ChronoUnit.MILLIS), 
    TimeUnit.MILLISECONDS); 

在Java版本中,您可以使用日历做同样的事情:

final ScheduledExecutorService executor = /* ... */ ; 

Runnable task = new Runnable() { 
    @Override 
    public void run() { 
     Calendar calendar = Calendar.getInstance(); 
     calendar.add(Calendar.MONTH, 1); 
     long delay = 
      calendar.getTimeInMillis() - System.currentTimeMillis(); 

     try { 
      // ... 
     } finally { 
      executor.schedule(this, delay, TimeUnit.MILLISECONDS); 
     } 
    } 
}; 

int dayOfMonth = 5; 

Calendar calendar = Calendar.getInstance(); 
if (calendar.get(Calendar.DAY_OF_MONTH) >= dayOfMonth) { 
    calendar.add(Calendar.MONTH, 1); 
} 
calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth); 
executor.schedule(task, 
    calendar.getTimeInMillis() - System.currentTimeMillis(), 
    TimeUnit.MILLISECONDS);