2016-08-18 58 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);