间隔几天执行问题

需要做到间隔几天执行问题,可以考虑如下:

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();
    }


这种就是可以不断的打印下次执行时间,特别是如果把下次执行时间存储在外部的时候,那么好处来了,可以灵活的改变这个调度的执行。

你可能感兴趣的:(java)