详解scheduleAtFixedRate 与 scheduleWithFixedDelay 的区别

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");
		@Override
		public 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");
		@Override
		public 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");
		@Override
		public 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
posted @ 2025-09-21 10:52  xiondun  阅读(122)  评论(0)    收藏  举报