当前位置: 首页 > news >正文

详解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");@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
http://www.jsqmd.com/news/836/

相关文章:

  • 模拟输入的过程
  • 基于Redisson和自定义注解的分布式锁实现策略
  • CCPC2025网络赛 游记
  • 深入解析:Python进阶第三方库之Numpy
  • 17.生成器和推导式 - 教程
  • 知行合一
  • Manim实现水波纹特效
  • CSP 2025 S1 游记
  • 深入解析:解锁AI智能体:上下文工程如何成为架构落地的“魔法钥匙”
  • JS之使用for...of赋值失败的原因分析
  • Linux /lib/modules/$(uname -r)/ 目录功能作用详解
  • 《建筑的永恒之道》第 27 章:道之核心
  • 软件工程第二次作业_个人项目
  • Linux命令大全(档案管理)
  • 小狼毫雾凇拼音安装部署
  • Chapter 3 Resize and Cropping
  • 详细介绍:java中常见的几种排序算法
  • Linux 内核VRF
  • 使用FFmpeg转换m4a
  • 提升多屏监控体验/新增辅屏预览功能/轻松实现跨屏实时监控/支持高达500路多个屏幕同时显示
  • [Java SE/文件系统/IO] 核心源码精讲:java.io.File
  • Linux 内核整体架构详解
  • Ubuntu 磁盘扩容与扩容失败障碍解决( df -h 与 GParted 显示空间不一致的问题 -LVM)
  • httplb 服务器
  • atoi() - 字符串( ASCLL )转换为整数( int )
  • 02.Python:Flash初步使用
  • 解决Kubernetes集群中master节点无法与node节点通信的策略
  • 从高版本的sqlserver向低版本的sqlserver上复制表和数据的方法
  • 【ROS2】 忽略局域网多机通信导致数据接收的bug - 教程
  • 在Ubuntu18.04安装兼容JDK 8的Eclipse集成开发环境