問題を数日間隔で実行
1987 ワード
数日間隔で実行する必要がある問題は、次のように考えられます.
このメリットは簡単です.次の時間はそんなに直感的に知らないかもしれません.例えば、10日間実行しました.次は明日実行しますか、それとも明後日実行しますか.前回の実行時間を簡単に見つける必要があるかもしれません.
または
これは、次回の実行時間を絶えず印刷することができ、特に次回の実行時間を外部に格納する場合、このスケジューリングの実行を柔軟に変更することができる利点がある.
ScheduledExecutorService exec = Executors.newScheduledThreadPool(1);
exec.scheduleWithFixedDelay(new MyTimeTask(), , , TimeUnit.DAYS);
このメリットは簡単です.次の時間はそんなに直感的に知らないかもしれません.例えば、10日間実行しました.次は明日実行しますか、それとも明後日実行しますか.前回の実行時間を簡単に見つける必要があるかもしれません.
または
public static void main(String[] args) {
ScheduledExecutorService exec = Executors.newScheduledThreadPool(1);
exec.scheduleWithFixedDelay(new MyTimeTask(), 0, 10, TimeUnit.SECONDS);
}
public class MyTimeTask implements Runnable {
private SimpleDateFormat simpleDateFormatt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private int interval = 5;
private Date runTime = new Date();
public MyTimeTask() {
try {
interval = Integer.parseInt(ParseProperties.newInstance().getProperty("interval"));
} catch (Exception e) {
e.printStackTrace();
}
String runTimes = ParseProperties.newInstance().getProperty("runTime");
if(StringUtils.isNotEmpty(runTimes)){
try {
runTime = simpleDateFormatt.parse(runTimes);
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
public void run() {
//
if(new Date().compareTo(runTime)>=0){
System.out.println(" ………………"+simpleDateFormatt.format(new Date()));
runTime = getNextRunTime();
System.out.println(" :"+simpleDateFormatt.format(runTime));
}
}
public Date getNextRunTime() {
Calendar cal = Calendar.getInstance();
cal.setTime(runTime);
// 2016-04-21 00:00:01 2017-04-21 18:20:00
// :2017-04-24 00:00:01
long n = (new Date().getTime() - runTime.getTime()) / (1000 * 60 * 60 * 24L) + interval;
cal.add(Calendar.DATE, (int) n);
return cal.getTime();
}
これは、次回の実行時間を絶えず印刷することができ、特に次回の実行時間を外部に格納する場合、このスケジューリングの実行を柔軟に変更することができる利点がある.