参数
scheduleAtFixedRate()方法的参数
- TimerTask task,执行的任务
- Date firstTime,第一次执行任务的时间
- long period,周期时间
直接看运行结果
-
我设置的任务周期时间为1分钟,即1分钟执行一次
-
从图中看出任务开始时间和当前时间间隔了4分18秒,向上取整为5分钟
-
任务直接就先跑了5次
-
跑完5次后,才按照我的周期进行一分钟一次任务执行,如图
总结
(1)追赶性就是如果我们设置任务开始的时间在当前时间之前,那么他会计算出两个时间的差,计算出时间差内能够执行任务多少次,然后立即执行。
(2)scheduleAtFixedRate具有追赶性,而Schedule不具有追赶性。
代码
代码放这,看不看都可以
public class Run {
private static Timer timer = new Timer();
private static int runCount = 0;
static public class MyTask1 extends TimerTask {
@Override
public void run() {
try {
System.out.println("开始!时间为:" + new Date());
Thread.sleep(2000);
System.out.println("结束!时间为:" + new Date());
runCount++;
System.out.println("=======================================执行完" + runCount + "次");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String args[]) {
try {
//新建任务
MyTask1 task1 = new MyTask1();
//设置任务开始时间
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString1 = "2019-4-18 10:30:00";
Date dateRef1 = format.parse(dateString1);
//计算出当前时间
Date d = new Date();
SimpleDateFormat ft = new SimpleDateFormat("hh:mm:ss");
System.out.println("自己定义任务开始时间为: 10:30:00,当前时间" + ft.format(d));
System.out.println("=======================================");
//开始循环执行任务(周期为1分钟)
timer.scheduleAtFixedRate(task1, dateRef1, 1000 * 60);
//timer.schedule(task1,dateRef1,1000*60);
} catch (ParseException e) {
e.printStackTrace();
}
}
}