说起java的定时执行,相信大家第一反应想到的就是ScheduledExecutorService为我们提供的方法scheduleAtFixedRate与scheduleWithFixedDelay,这两个方法很多人容易混淆,看上去都是定时去执行,这里我就和大家一起来看看二者之间的区别。(ScheduledExecutorService也提供了单次延迟执行的方法schedule,但不在本文讨论之列)
1.scheduleAtFixedRate
scheduleAtFixedRate从字面意思理解:固定频率执行。
scheduleAtFixedRate的关键要点:
- 固定频率执行
- 虽然是以固定频率执行,但必须等上个任务执行完毕,下个任务才能开始执行
- initialDelay为初始延迟,period为设置的执行间隔,runTime为任务执行时长。初次开始执行是在initialDelay之后,后续每次开始执行的间隔为max(period, runTime)
测试用例1:initialDelay=0,period=1,runTime可以认为也接近于0(时间单位设置为秒)
package com.newbie.schedule;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
* scheduleAtFixedRate与scheduleWithFixedDelay区别
*
* scheduleAtFixedRate:固定频率执行
* 虽然是以固定频率执行,但必须等上个任务执行完毕,下个任务才能开始执行
* initialDelay为初始延迟,period为设置的执行间隔,runTime为任务执行时长
* 初次开始执行是在initialDelay之后,后续每次开始执行的间隔为max(period,runTime)
*
*
* scheduleWithFixedDelay:固定延迟执行
* initialDelay为初始延迟,period为设置的执行间隔,runTime为任务执行时长
* 初次开始执行是在initialDelay之后,后续每次开始执行的间隔为runTime+period
* 上个任务执行完