scheduleAtFixedRate 和schedule

最近整了一个TimerTask 要求每天定点执行某一任务.
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.apache.log4j.Logger;

public class DoLogListener implements ServletContextListener {
	Timer t = null;

	public void contextInitialized(ServletContextEvent sce) {
		Calendar c = null;
		c = Calendar.getInstance();
		c.set(Calendar.HOUR_OF_DAY, 00);
		c.set(Calendar.MINUTE, 01);
		c.set(Calendar.SECOND, 00);
		Date date = c.getTime();
		t = new Timer();
		t.scheduleAtFixedRate(new TimerTask() {
			@Override
			public void run() {
				doSomething();
			}
		}, date, 24 * 60 * 60 * 1000);
                  //t.schedule(new TimerTask() {
		//	@Override
		//	public void run() {
		//		doSomething();
		//	}
		//}, date, 24 * 60 * 60 * 1000);

	}

	public void contextDestroyed(ServletContextEvent sce) {
		t.cancel();

	}

	public void doSomething() {
          System.out.println("sb")
			}
}

如果服务在当天00:01分以前被启动,两个方法都会在在00:01分时执行任务.
第二次任务执行时间都是00:01+24 * 60 * 60 * 1000,如果过了这个点后启服务两个方法都会马上执行任务.但第二次任务被执行的时间就是差别了,scheduleAtFixedRate是在你设置的date的基础上加24 * 60 * 60 * 1000这个时间段后执行而,schedule是在服务启动时间的基础上加24 * 60 * 60 * 1000这个时间段后执行.

	public static void main(String[] args) {
		Calendar c = Calendar.getInstance();
		c.set(2009, 04, 20, 11, 50,00);
		Date date = c.getTime();
		Timer t = new Timer();
		t.scheduleAtFixedRate(new TimerTask() {
			@Override
			public void run() {
				System.out.println("aaaaaaa");
			}
		}, date,2*60*1000);
	}


如果你在11:55:00启动服务scheduleAtFixedRate在服务启动时任务就会被执行3次.
11:50:00 第一次
11:52:00 第二次
11:54:00 第三次
第四次的执行时间是:11:56:00
如果用schedule在服务启动时任务只会被执行1次11:50:00第二次执行的时间是11:57:00.

你可能感兴趣的:(java,C++,c,log4j,C#)