详解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);
}

结果:可以看到上次任务完成后,间隔2s执行下次任务

00:16:45 >>1次执行定时任务.
00:16:47 >>2次执行定时任务.
00:16:49 >>3次执行定时任务.
00:16:51 >>4次执行定时任务.
00:16:53 >>5次执行定时任务.
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);
}

结果:可以看到,上次任务执行了3s结束后,立马执行下次任务

00:21:18 >>1次执行定时任务.
00:21:21 >>2次执行定时任务.
00:21:24 >>3次执行定时任务.
00:21:27 >>4次执行定时任务.
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);
}

结果:可以看到,上次任务执行3s完成后,延迟了2 s后才执行的下次任务
这个和2就有了明显的区别了

00:24:28 >>1次执行定时任务.
00:24:33 >>2次执行定时任务.
00:24:38 >>3次执行定时任务.
00:24:43 >>4次执行定时任务.
  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值