scheduleAtFixedRate:是以period为间隔来执行任务的,如果任务执行时间小于period,则上次任务执行完成后会间隔period后再去执行下一次任务;但如果任务执行时间大于period,则上次任务执行完毕后会不间隔的立即开始下次任务
而scheduleWithFixedDelay 是不管任务执行多久,都会等上一次任务执行完毕后再延迟delay后去执行下次任务
不多bb,直接上来代码来瞅瞅。。。
1、 scheduleAtFixedRate,任务执行时间小于period时
public static void circleScheduleTask() {ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);executorService.scheduleAtFixedRate(new Runnable() {private int count = 0;private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss");@Overridepublic void run() {String time = simpleDateFormat.format(new Date());System.out.println(time + " >>第"+ (++count) + "次执行定时任务.");}}, 0, 2000, TimeUnit.MILLISECONDS);
}
AI写代码java运行123456789101112
结果:可以看到上次任务完成后,间隔2s执行下次任务
00:16:45 >>第1次执行定时任务.
00:16:47 >>第2次执行定时任务.
00:16:49 >>第3次执行定时任务.
00:16:51 >>第4次执行定时任务.
00:16:53 >>第5次执行定时任务.
AI写代码java运行12345
2、scheduleAtFixedRate,任务执行时间大于period时
public static void circleScheduleTask() {ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);executorService.scheduleAtFixedRate(new Runnable() {private int count = 0;private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss");@Overridepublic void run() {String time = simpleDateFormat.format(new Date());System.out.println(time + " >>第"+ (++count) + "次执行定时任务.");try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}}}, 0, 2000, TimeUnit.MILLISECONDS);
}
AI写代码java运行1234567891011121314151617
结果:可以看到,上次任务执行了3s结束后,立马执行下次任务
00:21:18 >>第1次执行定时任务.
00:21:21 >>第2次执行定时任务.
00:21:24 >>第3次执行定时任务.
00:21:27 >>第4次执行定时任务.
AI写代码java运行1234
3、scheduleWithFixedDelay,任务执行时间大于delay
public static void circleScheduleTask() {ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);executorService.scheduleWithFixedDelay(new Runnable() {private int count = 0;private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss");@Overridepublic void run() {try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}String time = simpleDateFormat.format(new Date());System.out.println(time + " >>第"+ (++count) + "次执行定时任务.");}}, 0, 2000, TimeUnit.MILLISECONDS);
}AI写代码java运行123456789101112131415161718
结果:可以看到,上次任务执行3s完成后,延迟了2 s后才执行的下次任务
这个和2就有了明显的区别了
00:24:28 >>第1次执行定时任务.
00:24:33 >>第2次执行定时任务.
00:24:38 >>第3次执行定时任务.
00:24:43 >>第4次执行定时任务.
AI写代码java运行1234