問題を数日間隔で実行

1987 ワード

数日間隔で実行する必要がある問題は、次のように考えられます.
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();
    }

これは、次回の実行時間を絶えず印刷することができ、特に次回の実行時間を外部に格納する場合、このスケジューリングの実行を柔軟に変更することができる利点がある.