springboot @schedule和@Async定时任务的异步 同步 多任务并发

2023-10-27

@schedule

@schedule注解参数有如下

        cron:cron表达式,指定任务在特定时间执行;
       
 fixedDelay:表示上一次任务执行完成后多久再次执行,参数类型为long,单位ms;
        fixedDelayString:与fixedDelay含义一样,只是参数类型变为String;
       
 fixedRate:表示按一定的频率执行任务,参数类型为long,单位ms;
        fixedRateString: 与fixedRate的含义一样,只是将参数类型变为String;
       
 initialDelay:表示延迟多久再第一次执行任务,参数类型为long,单位ms;
       * initialDelayString:与initialDelay的含义一样,只是将参数类型变为String;

Delay的Rate区别在于Delay是任务完成之后多久执行, Rate是任务开始之后多久执行,一个是按完成时间计时 一个是按开始时间计时

@schedule原理

@schedule底层使用的是spring的任务调度线程池ThreadPoolTaskScheduler,ThreadPoolTaskScheduler底层使用的为JDK自带的ScheduledExecutorService(其实现类为ScheduledThreadPoolExecutor)

关于ScheduledThreadPoolExecutor(ScheduledExecutorService的实现)源码推荐文章https://www.jianshu.com/p/a39a89d28375</a>,<ahref="https://www.jianshu.com/p/8c4c160ebdf7" rel="nofollow">https://www.jianshu.com/p/8c4c160ebdf7</a>这边就不在详细说明了只做简单的说明

第一步 将任务添加到线程池的任务队列中

           此处知识点: 1 线程池:ScheduledThreadPoolExecutor 继承 ThreadPoolExecutor所以此处线程池为                                                                   ThreadPoolExecutor

                                  2 任务队列:此处任务队列为ThreadPoolExecutor中的一个无界延时阻塞队列(JDK队列推荐文章                                                     https://www.zybuluo.com/mikumikulch/note/712598</a>)</p>

第二步 线程池中的线程获取到延时队列中的任务第一次执行

第三步 延时队列中任务被线程执行完毕之后,重新根据我们传入的时间频率设置这个任务的时间放入到延时队列中,以此达到                任务被周期性反复的一直调用因为任务执行完之后才被放入到队列中再次选取线程执行  所以定时任务线程池中不管有多少线程,只有一个线程执行这个任务,这个任务结束之后,也会重新选取一个线程再次执行

注意:在spring中的@schedule默认的线程池中只有一个线程,所以如果在多个方法上加上@schedule的话,此时就会有多个任务加入到延时队列中,因为只有一个线程,所以任务只能被一个一个的执行

在使用时我们可以按需配置定时任务线程池线程的大小,这个就改变了线程数量默认为1的线程池

@Bean("threadPoolTaskScheduler")
    public ThreadPoolTaskScheduler threadPoolTaskScheduler(){
        ThreadPoolTaskScheduler executor = new ThreadPoolTaskScheduler();
        executor.setThreadNamePrefix("threadPoolTaskScheduler-");
        executor.setPoolSize(20);
        //设置线程池关闭的时候等待所有任务都完成再继续销毁其他的Bean
        executor.setWaitForTasksToCompleteOnShutdown(true);
        //设置线程池中任务的等待时间,如果超过这个时候还没有销毁就强制销毁,以确保应用最后能够被关闭,而不是阻塞住
        executor.setAwaitTerminationSeconds(60);
        //这里采用了CallerRunsPolicy策略,当线程池没有处理能力的时候,该策略会直接在 execute 方法的调用线程中运行被拒绝的任务;如果执行程序已关闭,则会丢弃该任务
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        return executor;
    }

@Async

此注解会将这个任务放入到一个异步线程中执行,不会阻塞主线程,可以用在一些比较耗时并且不用考虑返回值的一些操作中

比如有一个任务是3秒执行一次,一次任务执行需要8秒,若是吧这个任务加上@Async则这个任务就会放入到异步线程中去,

则这个任务不管这个任务执行的8秒还是依然会3秒执行一次,只是每次执行的结果需要8秒钟的延迟,但是结果我们一般是不考虑的

总结

① 默认@schedule  线程池默认只有一个线程,多个任务时串行   串行

@ 配置ThreadPoolTaskScheduler的@schedule 指定线程池中线程数量,多个任务并行  并行

@ 默认@schedule + @Aysnc 多个任务之间串行,单个任务非阻塞异步执行    串行+异步

@ 配置ThreadPoolTaskScheduler的@schedule+@Async  多个任务之间并行,单个任务非阻塞异步执行    并行+异步

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

springboot @schedule和@Async定时任务的异步 同步 多任务并发 的相关文章

随机推荐

  • el-table动态添加行,列。自定义输入表头,input hover 显示文字

    功能点 1 动态添加行 2 动态添加列 3 右键表头删除列 4 右键表体删除行 5 表格hover提示当前单元格文字 自动换行 6 表头文字自定义 7 表头 添加按钮固定 表体自适应滚动 效果图 代码 复制即可运行
  • web前端开发学习路径图

    第一阶段 WEB前端工程师课程 HTML语句 HTML页面结构 css语法 style属性 link和style标签 id属性 等HTML语句中的相关属性 通过Dreamweaver制作出跨越平台限制和跨越浏览器兼容性的页面 掌握Dream
  • 记录一次脱壳后修复apk

    前言 好不容易会脱壳 但是却仅仅只能得到dex文件 无法动态调试apk 这样还是不行 因此我们需要对源apk进行修复 准备 首先我这里是脱了一个爱加密的壳得到dump dex使用jadx gui可以正常打开 说明脱壳成功了 接下来就是将du
  • Python 日志 TimedRotatingFileHandler

    Python日志TimedRotatingFileHandler通常不是我们需求的 所以进行了一些重写 class MyTimedRotatingFileHandler TimedRotatingFileHandler 时间为切割点日志 d
  • TensorRT加速方法介绍(python pytorch模型)

    TensorRT的安装可见我的上一篇博客 Ubuntu配置TensorRT及验证 jiugeshao的专栏 CSDN博客博主的一些基本环境配置可见之前博客非虚拟机环境下Ubuntu配置 jiugeshao的专栏 CSDN博客第一步 准备安装
  • Java简易图书管理系统开发全过程 (2)

    今天我们继续来开发这个项目 Java简易图书管理系统开发全过程 2 代码层级规划 正式开干 代码层级规划 根据代码的功能 我们需要提前把代码的包等结构确定下来 由于这个项目是小型的 所以可以分为以下几部分 前端窗体 后端逻辑 全局变量存放类
  • 对雷达中相位补偿概念的一些理解

    以两个问题为例展开 分别是基于多普勒相位补偿的速度扩展方法 记为问题1 和DBF测角 记为问题2 两者本质上都是对相位进行补偿 为什么这么说呢 听我细细到来 如图 问题1的关键就是要去补偿掉TX2对应的接收天线RX5 RX8中的delta
  • window.showModalDialog以及window.open用法简介

    windows open 用法简介一 window open 支持环境 JavaScript1 0 JScript1 0 Nav2 IE3 Opera3 二 基本语法 window open pageURL name parameters
  • Mina基础(七):Mina整合Spring服务端、Spring boot 客户端

    Mina基础 一 基本结构分析 长短连接 IOService Mina基础 二 基础服务端 客户端搭建 Mina基础 三 IOFilter 自定义过滤器 日志过滤器 Mina基础 四 理解IoSession I O Processor Io
  • MATLAB中出现 索引超出矩阵维度,程序用matlab运行显示索引超出矩阵维度,请问怎么...

    公告 为响应国家净网行动 部分内容已经删除 感谢读者理解 话题 程序用matlab运行显示索引超出矩阵维度 请问怎么改 回答 用size函数可以求矩阵维数 用reshape可以改变数据维数 如 a 1 2 3 4 5 6 7 8 9 siz
  • 数据库模糊搜索时,关键字中有%号,怎么办?

    数据库模糊搜索时 关键字中有 号 怎么办 数据库模糊搜索时 都知道应该用通配符 号来模糊匹配 如 select from table where content like key 但当关键字key中也包含有 号时 应该怎么办 数据库中有关键
  • SpringBoot日志框架管理

    目录 一 SpringBoot日志框架的介绍 二 使用SpringBoot日志的好处 三 SpringBoot日志框架的使用 1 日志门面 日志的抽象层 2 日志实现 3 SpringBoot日志框架的引入 4 日志的格式 5 日志持久化
  • 生成项目结构图

    1 展示 D gitcode com spring pro test controller gt tree 文件夹 PATH 列表 卷序列号为 3289 54FC D settings src main java com cloud con
  • VScode在远程服务器进行python代码的调试【conda环境】

    conda环境 vscode连接远程环境 调试 vscode连接远程环境 其中vscode中需要安装扩展 remote ssh 装完扩展后本地多个图标 如下图所示 当然 初始状态不是这样 因为我已经配置好了哈 你需要点击 然后在框框中输入用
  • bootstrap-wizard插件

    bootstrap wizard的帮助文档 http vinceg github io twitter bootstrap wizard bootstrap wizard的GitHub地址 https github com gillumin
  • 一起学Redis(2)——链表、哈希表

    链表 废话不多说 今天继续学习Redis的基本数据结构 链表和哈希表 先看一个例子 以下展示的integers列表键包含了从1到1024共一千零二十四个整数 redis gt LLEN integers integer 1024 redis
  • 前端模糊匹配方式,前端正则模糊匹配

    前端的匹配方式有很多这里简单提供模糊匹配方式 使用 RegExp 函数 正则表达式来进行匹配 正则表达式 var list nai 43q 5xn var keyWord n var arr var reg new RegExp keyWo
  • 贪心算法的数学证明 (更新中)

    目录 1 贪心算法 2 贪心算法的证明方式 1 替换法 反证法 2 数学归纳法 递推法 1 贪心算法 定义 对于解决问题的每一个步骤 总选择当前步骤的局部最优解 希望以此达到总体最优 性质 贪心算法与搜索 动态规划一脉相承 但贪心算法并不遍
  • C# 消除游戏

    就是练成3个或者以上就消除的游戏我用C 没事写的 可能有漏洞 主要是练习C 的绘图 代码 Program cs using System using System Windows Forms namespace ColorRect
  • springboot @schedule和@Async定时任务的异步 同步 多任务并发

    schedule schedule注解参数有如下 cron cron表达式 指定任务在特定时间执行 fixedDelay 表示上一次任务执行完成后多久再次执行 参数类型为long 单位ms fixedDelayString 与fixedDe