上个厕所的功夫,就把定时任务的三种调度策略说得明明白白

2023-11-07

Spring Task 无疑是 Spring 环境下单机定时任务的首选。它用起来非常简单,功能也够用。

Spring Task 有三种模式,分别是:fixedDelay、cron 和 fixedRate。话不多说,我们先看代码:

@Slf4j
@Component
public class TimeTask {

    private int[] people = {6, 2, 3, 1};

    private int count = 0;

    @Scheduled(fixedDelay = 5000)
    public void fixedDelayTask() throws InterruptedException {
        if (count < 4) {
            int timeConsuming = people[count];
            log.info("fixedDelayTask-----第 {} 个人在 {} 开始如厕,耗时:{} 秒", count + 1, 
                    formatTime(), 
                    timeConsuming);
            Thread.sleep(timeConsuming * 1000L);
            count++;
        }
    }

    @Scheduled(cron = "0/5 * * * * ? ")
    public void cronTask() throws InterruptedException {
        if (count < 4) {
            int timeConsuming = people[count];
            log.info("cronTask-----第 {} 个人在 {} 开始如厕,耗时:{} 秒", count + 1, 
                    formatTime(), 
                    timeConsuming);
            Thread.sleep(timeConsuming * 1000L);
            count++;
        }
    }

    @Scheduled(fixedRate = 5000)
    public void fixedRateTask() throws InterruptedException {
        if (count < 4) {
            int timeConsuming = people[count];
            log.info("fixedRateTask-----第 {} 个人在 {} 开始如厕,耗时:{} 秒", count + 1,
                    formatTime(),
                    timeConsuming);
            Thread.sleep(timeConsuming * 1000L);
            count++;
        }
    }

    private String formatTime() {
        return LocalTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss"));
    }
}

这三种模式的用法都很简单,使用方式也很类似。那么它们究竟有什么不同呢?下面我们通过一个五星级豪华公测的故事来说明一下。

故事背景

话说某地有一个五星级豪华厕所,大家都喜欢来这里如厕。因此坑位经常供不应求,需要排队如厕。一天,厕所外有四个人排队,每个人如厕需要的时间如下:

  • 第一个人 6 秒钟
  • 第二个人 2 秒钟
  • 第三个人 3 秒钟
  • 第四个人 1 秒钟

从第一个人开始如厕进行计时。

fixedDelay 模式

日志输出:

fixedDelayTask-----第 1 个人在 18:07:23 开始如厕,耗时:6 秒
fixedDelayTask-----第 2 个人在 18:07:34 开始如厕,耗时:2 秒
fixedDelayTask-----第 3 个人在 18:07:41 开始如厕,耗时:3 秒
fixedDelayTask-----第 4 个人在 18:07:49 开始如厕,耗时:1 秒

@Scheduled(fixedDelay = 5000)

厕所在该模式下有一个特点:每次用完厕所后,需要有 5 秒钟的厕所自洁时间,需要对厕所进行清洁消毒等工作,从而保证下次使用的时候依然干净卫生。执行情况如图所示:

在这里插入图片描述

  1. 第一个人在第 0 秒时开始如厕,6 秒后结束,厕所需要 5 秒钟的自洁时间;
  2. 第二个人在第 11 秒(6+5)时开始如厕,2 秒后结束,厕所需要 5 秒钟的自洁时间;
  3. 第三个人在第 18 秒(11+2+5)时开始如厕,3 秒后结束,厕所需要 5 秒钟的自洁时间;
  4. 第四个人在第 26 秒 (18+3+5)时开始如厕,1 秒后结束…

Cron 模式

日志输出:

cronTask-----第 1 个人在 18:09:15 开始如厕,耗时:6 秒
cronTask-----第 2 个人在 18:09:25 开始如厕,耗时:2 秒
cronTask-----第 3 个人在 18:09:30 开始如厕,耗时:3 秒
cronTask-----第 4 个人在 18:09:35 开始如厕,耗时:1 秒

@Scheduled(cron = "0/5 * * * * ? ")

在该模式下,厕所只在时间秒数 5 的整数倍时准许人员进入使用。因为通过严谨的科学分析,发现在秒数为 5 的整数倍时如厕体验更佳,所以只有当前时间秒数为 5 的整数倍时才可以进入。并且,五星级豪华公测升级设备,可以在如厕完成的瞬间完成自洁消毒,因此不再需要额外的自洁时间了,也提升了厕所利用率。执行情况如图所示:

在这里插入图片描述

  1. 第一个人在 18:09:15 时开始如厕,6 秒后(18:09:21)结束,下一个如厕吉时为 18:09:25;
  2. 第二个人在 18:09:25 时开始如厕,2 秒后(18:09:27)结束,下一个如厕吉时为 18:09:30;
  3. 第三个人在 18:09:30 时开始如厕,3 秒后(18:09:33)结束,下一个如厕吉时为 18:09:35;
  4. 第四个人在 18:09:35 时开始如厕,1 秒后(18:09:36)结束…

fixedRate 模式

日志输出:

fixedRateTask-----第 1 个人在 18:10:18 开始如厕,耗时:6 秒
fixedRateTask-----第 2 个人在 18:10:24 开始如厕,耗时:2 秒
fixedRateTask-----第 3 个人在 18:10:28 开始如厕,耗时:3 秒
fixedRateTask-----第 4 个人在 18:10:33 开始如厕,耗时:1 秒

@Scheduled(fixedRate = 5000)

经过长时间的大数据分析,得出一个结论——人的最佳如厕时长是 5 秒钟。所以在该模式下,人们如厕前,厕所会根据等待人数提前制定出如厕计划,即为每位等待者分配 5 秒钟如厕时间。但是有一个规则:当如厕者提前结束,那么下一个人仍然需要等够 5 秒钟;而当如厕者超时以后,待厕者可以在上一人完成时立即如厕。那么:

如厕计划如下:

  1. 第一个人:第 0 秒进入
  2. 第二个人:第 5 秒进入
  3. 第三个人:第 10 秒进入
  4. 第四个人:第 15 秒进入

根据故事背景中每个人如厕时间,实际情况如图所示:

在这里插入图片描述

  1. 第一个人在第 0 秒时,即 18:10:18 时开始如厕,6 秒后结束,超时,第二个人无缝如厕;
  2. 第二个人在第 6 秒(0+6)时,即 18:10:24 开始如厕,2 秒后结束,未超时,第三个人等待 2 秒,按计划时间如厕;
  3. 第三个人在第 10 秒(6+2+2)时,即 18:10:28 开始如厕,3 秒后结束,未超时,第四个人等待 2 秒按计划如厕;
  4. 第四个人在第 15 秒 (6+2+2+3+2)时,即 18:10:33 开始如厕,1 秒后结束…

Cron 表达式

Cron 模式是定时任务中最强大的触发策略,可以应对更多的情况。一个 Cron 表达式总共有 7 个元素,分别如下表所示:

时间单位 是否必填 取值范围 通配符
0-59 的整数 , - * / 四个字符
0-59 的整数 , - * / 四个字符
0-23 的整数 , - * / 四个字符
1-31 的整数(需要考虑该月的具体天数) ,- * ? / L W C 八个字符
1~12 的整数或者 JAN-DEC , - * / 四个字符
1~7 的整数或者 SUN-SAT (1=SUN) , - * ? / L C # 八个字符
1970~2099 , - * / 四个字符

更多独家精彩内容尽在我的新书《Spring Boot趣味实战课》中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

上个厕所的功夫,就把定时任务的三种调度策略说得明明白白 的相关文章

随机推荐

  • 【计算机网络系列】网络层②:详解网际协议IP中的IP地址

    网际协议IP 网际协议IP Internet Protocol 是TCP IP体系中两个最主要的协议之一 也是最重要的互联网标准协议之一 与协议IP配套使用的还有三个协议 地址解析协议ARP Address Resolution Proto
  • win10下 + cuda10.2 + 双目相机zed 2i sdk的安装

    zed 2i 环境搭建 1 安装cuda和cudnn 2 安装zed sdk 3 安装API 本实验用的是pycharm平台 python3 7 主要讲解zed 2i sdk的安装以及遇到的问题 1 安装cuda和cudnn 我们实验之前已
  • qt中在QMultiMap中删除自定义数据类的元素

    引言 当我们使用QMultiMap的remove函数来删除容器中的某一个元素时 若是容器中存放的是基本数据类型 则程序编译的时候没有任何问题 但是当容器中存放的是自定义的数据 这时若是C 基础比较扎实的 应该不会出现编译报错的问题 但是C
  • 桥接模式下虚拟机连不上网络的解决方法

    新建的虚拟机 开启虚拟机后 无法ping到网络 ping www baidu com 显示如下 无法连接到网络 或者输入命令 ifconfig ens33网卡显示像下面这样 没有自动分配ip地址 也可能是ens0网卡 正常连上网络 会自动为
  • 精确计算-BigDecimal类

    基本方法 加法 add 函数 减法 subtract 函数 乘法 multiply 函数 除法 divide 函数 绝对值 abs 函数 重点介绍除法 使用除法函数在divide的时候要设置各种参数 要有除数 精确的小数位数和舍入模式 舍入
  • BUUctf-web:[ACTF2020 新生赛]Exec1

    1 就是按位或 直接执行 后面的语句 2 就是逻辑或 如果前面命令是错的那么就执行后面的语句 否则只执行前面的语句 3 就是按位与 前面和后面命令都要执行 无论前面真假 4 就是逻辑与 如果前面为假 后面的命令也不执行 如果前面为真则执行两
  • Form表单之get提交与post提交

    Form表单之get提交与post提交 Form表单的属性action 与method 属性 值 描述 action URL 规定当提交表单时向何处发送数据 method get post 规定用于发送form data的HTTP方法 提交
  • 兆易创新嵌入式软件工程师笔试题目解析

    哈喽 大家好 今天分享的是兆易创新的嵌入式软件开发工程师的笔试题目 这份题目中等难度 考察基础知识的偏多 最后的编程题只考了一个结构体数组的初始化 所以 在准备校招时 将重点还是要放在基础知识上 下面看下这份题目你可以答几分 本文已同步更新
  • Connect Dynamics 365 and Social Engagement

    Establish a connection between Social Engagement and Dynamics 365 To connect Dynamics 365 online and Social Engagement b
  • 通达信四色谱四量图源码_通达信指标公式源码波段抄底副图指标

    入市建仓 VAR2 REF LOW 1 VAR3 SMA ABS LOW VAR2 13 1 SMA MAX LOW VAR2 0 13 1 100 VAR4 EMA IF CLOSE 1 2 VAR3 13 VAR3 13 13 VAR5
  • 飞书文档导出pdf不带书签/大纲 问题

    问题 我在飞书上整理了很多笔记 有天想把它导出本地 主要原因是有时候网络不好时 网页版的飞书加载比较慢 此外 我还想将其打印成纸质版来看 比较有感觉 飞书我是可以看到各个大纲级别的标题的 一级大纲 二级大纲这样整理非常方便 但是当我导出为p
  • 交叉编译tslib (正确版)

    1 下载安装交叉编译器 编译器版本不限 需要与系统移植时的编译器保持一致即可 2 下载tslib1 4 3 交叉编译tslib 1 4 下载的tslib 1 4 tar gz放到 home driver ts 目录下 cd home dri
  • 手写算法-Python代码实现非线性回归

    手写算法 Python代码实现非线性回归 生成非线性数据集 1 用线性回归拟合 2 多项式拟合 sklearn实现 校验系数的结果 总结 生成非线性数据集 前面我们介绍了Python代码实现线性回归 今天 我们来聊一聊当数据呈现非线性时 这
  • 嵌入式监控【v4l2采集->vpu编码->live555推流】

    嵌入式监控 v4l2采集 gt vpu编码 gt live555推流 文章目录 嵌入式监控 v4l2采集 gt vpu编码 gt live555推流 介绍 数据流图 一 v4l2 1 1 确定cam的输出格式 1 2 YUYV 转 YUV4
  • 【机器学习系列】如何将多条ROC曲线画在一张图里,并解决文本遮挡问题

    有的时候我们需要将ROC曲线输出在同一张图中 这样可以更加直观地对比模型 并且我们常常会遇到在图形中有文字相互遮挡的问题 我们可以用adjustText中的adjust text来实现文本不相互遮挡并添加箭头的功能 定义多条roc曲线画图函
  • 股票交易系统的服务器,股标交易传输系统

    本词条缺少概述图 补充相关内容使词条更完整 还能快速升级 赶紧来编辑吧 股标交易传输系统在Windows 环境下将原有的传输和显示系统进行改进 使它们在 Windows 环境下可以并发执行 而且可以和其它应用 程序协调地共享资源 这不仅实现
  • 基于labview实现MYSQL数据库查询功能

    前言 labview是一款功能强大的图形化编程软件 也就是俗称的G语言 本篇将介绍如何利用labview对MYSQL进行列表分页 范围查询及模糊查询等几个可广泛应用的简易功能 但事实上labview并不擅长处理数据库 下面详细代码可体现 数
  • spring-boot,java 微服务,跨域配置

    只需要在启动类下面与run方法同级加上下面那串代码即可 public static void main String args SpringApplication run ApplicationService class args Over
  • Visual Studio 2019中使用Qt,步骤详解

    本文学习的目的就是在Visual Studio 2019环境下能够顺利的运行Qt程序 下面是一些具体的配置安装过程 首先 打开visual Studio 2019 继续但无需代码 如图 然后点击扩展 管理扩展 在搜索框中搜索Qt 点击下载插
  • 上个厕所的功夫,就把定时任务的三种调度策略说得明明白白

    Spring Task 无疑是 Spring 环境下单机定时任务的首选 它用起来非常简单 功能也够用 Spring Task 有三种模式 分别是 fixedDelay cron 和 fixedRate 话不多说 我们先看代码 Slf4j C