本文介紹了使用ScheduledExecutorService計劃每月任務的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我要將任務安排在每月的特定日期和特定時間。每次運行之間的間隔可以設置為1到12個月。在Java中,可以使用ScheduledExecutorService以固定的時間間隔調度任務。由于一個月的天數不是固定的,如何實現這一點?
提前感謝。
推薦答案
如果您在JavaEE環境中運行,則應該使用TimerService或@Schedule注釋。但是,由于您討論的是ScheduledExecutorService,它不允許在Java EE容器中使用,所以我假定您沒有在容器中運行。
使用ScheduledExecutorService時,您可以讓任務本身計劃下一次迭代:
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);
在早于8的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);
這篇關于使用ScheduledExecutorService計劃每月任務的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,