1, 试用代码
package com
.dosrain
.shunc
.trial
.schedule
;
import java
.text
.SimpleDateFormat
;
import java
.util
.Date
;
import java
.util
.Timer
;
import java
.util
.TimerTask
;
public class TimerTest {
public static void main(String
[] args
) throws Exception
{
SimpleDateFormat sdf
= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Timer timer
= new Timer();
TimerTask timerTask1
= new TimerTask() {
@Override
public void run() {
SimpleDateFormat sdf
= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System
.out
.println(Thread
.currentThread().getName()
+ " " + sdf
.format(new Date())
+ ": task-1 start");
System
.out
.println(Thread
.currentThread().getName()
+ " " + sdf
.format(new Date())
+ ": task-1 end");
}
};
TimerTask timerTask2
= new TimerTask() {
@Override
public void run() {
SimpleDateFormat sdf
= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System
.out
.println(Thread
.currentThread().getName()
+ " " + sdf
.format(new Date())
+ ": task-2");
}
};
timer
.scheduleAtFixedRate(timerTask1
, sdf
.parse("2020-07-03 15:35:00"), 1000*3);
timer
.schedule(timerTask1
, sdf
.parse("2020-07-03 15:35:00"), 1000*5);
}
}
2, 理解区别
timer.scheduleAtFixedRate(timerTask1, sdf.parse("2020-07-03 15:35:00"), 1000*5);timer.schedule(timerTask1, sdf.parse("2020-07-03 15:35:00"), 1000*5);
第1行代码,scheduleAtFixedRate,表示到达指定时间后马上执行,然后每间隔5秒,重复执行一次。
第2行代码,schedule,表示到达指定时间后马上执行,然后每间隔5秒,重复执行一次。
两者的区别在于,
scheduleAtFixedRate 中,指定的时间在当前时间之前的话,会计算当前时间与指定时间的时间差,再除以间隔时间,得出要补算的次数,然后立即执行补算,且每次补算之间,不再停顿指定的间隔时间。
schedule 中,指定的时间在当前时间之前的话,会执行一次,然后等待间隔时间到后,再重复执行,不会补算。