schedule与scheduleAtFixedRate的区别
情况1:计划执行的时间早于当前的时间。
schedule方法:当调用该方法时,调用定时任务的时间以当前时间为准,可以通过调用scheduleExecutionTime查看时间的基准。(设置了00:00开始执行,每两秒钟执行一次,但是任务开始的时候是00:06,那么就会执行00:06 00:08 )
scheduleAtFixedRate():调用该方法时,以方法中传入的时间为准,例如,传入的时间为12:00,那么scheduleExecutionTime()的时间就是12:00,如果当前时间晚于传入的时间,那么就会进行追赶多次执行该方法。注意:它存在并发性,例如图片中当前时间为15:05:31,但是调用定时任务的时间为15:05:25,那么它就会在同一时间执行三次该方法。 25 27 29 31,25 27 29是一瞬间执行
情况2:任务执行所需时间超出任务执行的时间间隔。
schedule方法:比如规定2s执行一次,但是执行需要3s,那么schedule(timeTask,calender.getTime(),2000),就会在设置的calender中执行一次,以及3s后执行一次
scheduleAtFixRate(): 比如规定2s执行一次,但是执行需要3s,那么schedule(timeTask,calender.getTime(),2000),就会在设置的calender中执行一次,以及2s后执行一次,存在并发性
schedule与scheduleAtFixedRate的区别
情况1:计划执行的时间早于当前的时间。
schedule方法:当调用该方法时,调用定时任务的时间以当前时间为准,可以通过调用scheduleExecutionTime查看时间的基准。
scheduleAtFixedRate():调用该方法时,以方法中传入的时间为准,例如,传入的时间为12:00,那么scheduleExecutionTime()的时间就是12:00,如果当前时间晚于传入的时间,那么就会进行追赶多次执行该方法。注意:它存在并发性,例如图片中当前时间为15:05:31,但是调用定时任务的时间为15:05:25,那么它就会在同一时间执行三次该方法。
情况2:任务执行所需时间超出任务执行的时间间隔。
schedule()
scheduleAtFixedTime()
scheduleAtFixedRate方法
“fixed-rate”;如果第一次执行时间被delay了,随后的执行时间按照上一次开始的时间点进行计算,并且为了赶上进度会多次执行任务,因此TimerTask中的执行体需要考虑
schedule与scheduleAtFixedRate的区别
从两种情况看区别
1、首次计划执行的时间早于当前的时间(比如:当前时间是双十一的00:00:06而我们计划执行的时间是双十一的00:00:00)
2、任务执行所需的时间超出任务的执行周期间隔(比如:这个任务需要每隔两秒执行一次,但是单次这个任务的执行时间就是3秒)
任务执行时间超出执行周期间隔
任务执行时间超出执行周期间隔
public class ScheduleAtFixedRateTest {
public static void main(String[] args) {
//规定时间格式
final SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//获取当前的具体时间
Calendar calendar = Calendar.getInstance();
System.out.println("Current time is: " + sf.format(calendar.getTime()));
//设置成6秒前的时间,若当前时间为2018-3-17 16:03:30,那么设置之后时间变成2018-3-17 16:03:24
calendar.add(Calendar.SECOND, -6);
Timer timer = new Timer();
//第一次执行时间为6秒前,之后每隔两秒执行一次
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
//打印当前的计划执行时间
System.out.println("Scheduled exec time is: " + sf.format(scheduledExecutionTime()));
System.out.println("task is being executed!");
}
}, calendar.getTime(), 2000);
}
}
首次计划执行时间早于当前时间
首次计划执行时间早于当前时间
scheduleAtFixedRate:下次开始执行的时间以上次run方法开始时间为基准。
schedule:下次开始执行的时间以上次run方法完成时间为基准。
scheduleAtFixedRate:同样时间回到过去,但是开始执行多次到达正常时间,然后间隔时间输出。
schedule:时间回到过去,但是开始执行时以一次到达正常时间,然后间隔时间输出。