scheduleAtFixedRate 与 scheduleWithFixedDelay 的区别

本文详细解析了ScheduledExecutorService中scheduleAtFixedRate与scheduleWithFixedDelay两种调度方式的不同之处,并通过示例代码说明了这两种方法的具体用法。此外,还特别提醒了在使用这些调度方式时需要注意的任务异常处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

总结:

scheduleAtFixedRate ,是以上一个任务开始的时间计时,period时间过去后,检测上一个任务是否执行完毕,如果上一个任务执行完毕,则当前任务立即执行,如果上一个任务没有执行完毕,则需要等上一个任务执行完毕后立即执行。

scheduleWithFixedDelay,是以上一个任务结束时开始计时,period时间过去后,立即执行。

重点:

两个方法以不同的时间点作为参考。

例子:

package com.yuankai.t1.thread;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class ScheduleExecutorServiceTest {

public static void main(String[] args) {
	ScheduleExecutorServiceTest test = new ScheduleExecutorServiceTest();
	test.testWithFixedDelay();
}

private ScheduledExecutorService executor;

public ScheduleExecutorServiceTest() {
	executor = Executors.newScheduledThreadPool(4);
}

public void testAtFixedRate() {
	executor.scheduleAtFixedRate(new Runnable() {
		
		public void run() {
			System.out.println("====");
			try {
				Thread.sleep(10000);
				System.out.println("执行完毕");
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}, 1000, 3000, TimeUnit.MILLISECONDS);
}

public void testWithFixedDelay() {
	executor.scheduleWithFixedDelay(new Runnable() {
		
		public void run() {
			System.out.println("====");
			try {
				int i = 1 / 0;
			} catch (Exception e) {
				e.printStackTrace();
			}
			/*
			try {
				Thread.sleep(10000);
				System.out.println("执行完毕");
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			*/
		}
	}, 1000, 3000, TimeUnit.MILLISECONDS);
}

}

注意:
通过ScheduledExecutorService执行的周期任务,如果任务执行过程中抛出了异常,那么过ScheduledExecutorService就会停止执行任务,且也不会再周期地执行该任务了。所以你如果想保住任务都一直被周期执行,那么catch一切可能的异常
————————————————
版权声明:本文为CSDN博主「琳凯」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u013819945/article/details/47723091

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值