java.util.Timer
schedule(TimerTask task,Date firstTime, long period)
jdk 1.5.0
* 当初始化后,第一次执行时间以及执行周期就和系统时间没有关系了(即调慢,或者调快系统时间,不影响定时器实际执行时间和执行间隔)
* 如果在初始化时,第一次执行时间小于当前时间,则执行一次。
* 下次执行时间 = 上次执行完成时间 + 执行周期
下面是示例代码
import java.util.Calendar;
import java.util.Date;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
public class TimerTest {
public static void main(String[] args) {
new TimerTest().test();
}
public void test() {
Date date = new Date();
//现在时间21:48:00
//第一次触发是2分钟后,间隔是1秒。
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 21);
cal.set(Calendar.MINUTE, 50);
cal.set(Calendar.SECOND, 0);
// cal.set(Calendar.DAY_OF_MONTH, cal.get(Calendar.DAY_OF_MONTH) + 1);
date = cal.getTime();
init(date, 1000);
}
/**
* 当初始化后,第一次执行时间以及执行周期就和系统时间没有关系了(即调慢,或者调快系统时间,不影响定时器执行时间)
* 如果在初始化时,第一次执行时间过去于当前时间,则执行一次。
* 下次执行时间 = 上次执行完成时间 + 执行周期
*
* @param date
* @param period
*/
public void init(Date date, long period) {
Timer timer = new Timer();
timer.schedule(new SendAwardTask(), date, period);
}
class SendAwardTask extends TimerTask {
int i = 0;
@Override
public void run() {
System.out.println("Test Send Award...[" + i++ + "]");
Random random = new Random();
int delaySecond = random.nextInt(10);
try {
Thread.sleep(delaySecond * 1000l);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}