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

一起来探究@Schedule定时任务在分布式产生的问题 定时任务的实现方式多种多样,框架也是层出不穷。本文所谈及的是 SpringBoot 本身所带有的实现定时任务的方式。以及采用这种方式,在分布式调度中可能会出现的问题,又针对为什么会发生这种问题?又该如何解决,做出了一些叙述。为了适合每个阶段的读者,我把前面测试的代码都贴出来啦~ 阅读详情

@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,https://www.jianshu.com/p/8c4c160ebdf7这边就不在详细说明了 只做简单的说明

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

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

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

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

第三步 延时队列中任务被线程执行完毕之后,重新根据我们传入的时间频率设置这个任务的时间放入到延时队列中,以此达到                任务被周期性反复的一直调用

因为任务执行完之后才被放入到队列中再次选取线程执行  所以定时任务线程池中不管有多少线程,只有一个线程执行这个任务,这个任务结束之后,也会重新选取一个线程再次执行

注意:在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  多个任务之间并行,单个任务非阻塞异步执行    并行+异步

【SpringBoot系列】Springboot 重点知识点最强整理 目录 1、springboot controller 单例 2、Springboot 环境变量配置 3、restful 接口 4、@ResponseBody 和 @RequestBody 的区别 5、@Schedule 6、async异步调用 7、request 的获取方式和线程安全 1、springboot controller 单例 Spring中 controller默认是单例的,因为单例所以不是线程安全的。 所以需要注意下面几点 不要在Controller中定义成员变量,可 阅读详情

相关推荐

Cadence Virtuoso VIVA波形分析:从背景色修改到线宽调整的完整指南

本文详细介绍了Cadence Virtuoso VIVA波形分析工具的核心使用技巧,包括背景色修改、线宽调整等高级功能。通过具体操作步骤和配置方法,帮助工程师优化波形显示效果,提升工作效率。特别强调了与Calculator组件的配合使用,以及专业波形图的输出技巧。

weixin_27330481的博客 621

@Scheduled和@Async解析与自定义线程池

@Scheduled和@Async注解解析与自定义线程池

qq_39173672的博客 3215

Linux音频处理实战:从MP3解码到ALSA播放的完整流程解析

本文详细解析了Linux环境下从MP3文件解码到通过ALSA播放音频的完整实战流程。文章深入剖析了MP3文件结构、PCM原始音频数据格式,并提供了使用ffmpeg/mpg123解码、以及利用ALSA库进行C语言编程播放的实用代码示例,帮助开发者彻底掌握Linux音频处理的核心链路。

weixin_29206669的博客 72

Spring 异步和定时使用方法总结

https://www.cnblogs.com/duanxz/p/6782847.html 和 https://www.cnblogs.com/duanxz/p/6782933.html

weixin_36098377的博客 193

3分钟接入满血版DeepSeek-R1:字节火山引擎手把手教程!免费50万tokens!

3分钟接入满血版DeepSeek-R1:字节火山引擎手把手教程!免费50万tokens!

hunteritself的博客 2万+

计算机考研复试面试常问问题 数据结构篇(下)

计算机考研复试面试常问问题 数据结构篇(下) 使用前需知(拒绝白嫖,如果对你有帮助,你只需点个赞就行): 注意:有人在闲鱼上盗卖我的资料,而且还有很多同学买了,请各位擦亮双眼,我是整理出来免费分享给大家的! 大家请多点赞和评论,这样后面的同学更容易百度到,不至于被人盗卖,我就不加水印影响大家使用了! 第一次整理,度不好控制,有不好的地方希望大家理解,后面可能会改进,造福今年之后的同学们! ...

程序员宝藏的博客 1万+

Scheduled定时任务异步执行

Scheduled定时任务异步执行

wang20010104的博客 2274

如何通过单步调试的方法,找到 SAP Gateway 到底把 Fiori 应用发送的 OData 请求,投递到哪一台 ABAP 后台服务器了?

这是一个 Count 请求,得到服务器响应的数据是 204,这个 204 会以数字的形式,显示在 Fiori Launchpad tile 上。那如果当前 Gateway 系统可以连接到多台 ABAP 后台服务器,比如下图所示,可以连接 SAP S/4HANA,ERP 或者 SAP CRM,我怎么知道 SAP UI5 应用上显示的数据,到底来自哪一台 ABAP 后台服务器呢?,就是上图 ABAP 调试器里断点停留的位置,即 SAP Frontend 服务器,通过 RFC 将 OData 请求投递给。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 641

Spring使用@Async注解

本文讲述@Async注解,在Spring体系中的应用。本文仅说明@Async注解的应用规则,对于原理,调用逻辑,源码分析,暂不介绍。对于异步方法调用,从Spring3开始提供了@Async注解,该注解可以被标注在方法上,以便异步地调用该方法。调用者将在调用时立即返回,方法的实际执行将提交给Spring TaskExecutor的任务中,由指定的线程池中的线程执行。 在项目应用中,@Async调用线程池,推荐使用自定义线程池的模式。自定义线程池常用方案:重新实现接口AsyncConfigurer...

1 2036

【赛题解析&命令脚本配置】2023年全国职业院校技能大赛GZ073网络系统管理赛项赛题第10套模块A:网络构建 & (五)网络运维配置+(六)SDN网络配置-命令配置

【赛题解析&命令脚本配置】2023年全国职业院校技能大赛GZ073网络系统管理赛项赛题第10套模块A:网络构建 & (五)网络运维配置+(六)SDN网络配置-命令配置

君逍遥o 809

利用插件扩展 Qt 应用程序

不仅 Qt 本身可以通过插件进行扩展,而且 Qt 应用程序也可以通过插件来扩展,这需要应用程序使用 `QPluginLoader` 检测和加载插件。

青春不老,奋斗不止! 1万+

@Async @Scheduled的并发问题

问题场景:系统中@Scheduled设置的定时任务每两分钟执行一次,某一天上线了后发现@Scheduled不按时执行,经过排查发现是Spring内部某些内容共用了默认线程池,导致线程池资源不够而抢占资源导致。当时上线的是Kafka内容,引用了spring-kafka,经查发现其使用的线程池和@Scheduled是相同的默认线程池所以出现的问题,Kafka的大量并发持续占满线程池,导致定时任务抢占不到。 文章目录源码分析过程@Async@EnableAsync@EnbaleAsync的属性annotati.

爱清清的专栏 2037

【报错解决】OpenClaw 报错 EACCES: permission denied:安装权限不足

本文针对国产操作系统环境下使用 npm 安装 OpenClaw 时出现的 EACCES 权限错误,提供了专业解决方案。文章首先分析了问题本质是 npm 全局安装路径与 Linux 权限模型的冲突,然后给出三种解决方案:1)配置用户级 npm 全局目录(推荐);2)使用 nvm 管理 Node.js;3)临时使用 sudo(不推荐)。特别强调在企业环境中应避免使用 root 权限安装,并详细说明了如何正确设置用户级 npm 路径,确保符合生产环境的安全审计要求。该方案同样适用于 OpenEuler、OpenC

博客 3190

使用@Schedule注解实现定时任务,多线程执行定时任务,Cron表达式详解

使用@Schedule注解实现定时任务,多线程执行定时任务,Cron表达式详解

樂小伍 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

@Schedule定时任务并行(异步)处理

最近项目中遇到一个问题 , 在SpringBoot中设置了定时任务之后 , 在某个点总是没有执行 . 经过搜索研究发现 , spring 定时器任务scheduled-tasks默认配置是单线程串行执行的 . 即在当前时间点之内 . 如果同时有两个定时任务需要执行的时候 , 排在第二个的任务就必须等待第一个任务执行完毕执行才能正常运行.如果第一个任务耗时较久的话 , 就会造成第二个任务不能及时执行...

qq_21036901的博客 3914

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

@Schedule 解决定时任务推迟执行

讲解三种 @Scheduled 解决定时任务进程堵塞,未及时执行的问题

Dily_Su的博客 6268

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Springboot @Schedule + 线程池配置可以轻松实现多个任务之间异步, 但是同一任务同步执行

Springboot @Scheduled 默认是单线程的, 也就是说当我们定义了多个定时任务时,如果有本应该是相同时间触发的定时任务, 会进行排队, 如果某个定时任务执行时间过长, 就会导致其他定时并未按照设置时间来触发执行。 异步任务可以部分解决这个问题, 在定时任务上再加上@Asyns注解,定时任务就会被作为异步任务多线程执行。 @Async @Scheduled(cron = "*/5 * * * * ?") public void mapDiagnosisExecutor() throws I

ElegantApple的博客 7046

SpringBoot定时任务@Schedule注解单线程阻塞

@Scheduled定时任务

weixin_42867178的博客 1987

【Java定时任务】SpringBoot+@Schedule注解

可以看到,最大线程数使用的是Integer.MAX_VALUE,即对于每一次定时任务的执行都会创建新的线程,并发环境下,会。【3】实现类上要有组件的注解@Component,@Service,@Repository。【1】cron表达式配置的任务如果执行超时,会从上一个任务结束的时间开始计算间隔。启用@EnableAsync注解,并在每一个定时任务方法上使用@Async注解。下一次的任务执行时间是从上一次定时任务结束时间开始计算。下一次的任务执行时间是从上一次定时任务开始时间开始计算。

神也在Cpoy 2122

SpringBoot定时任务+自定义线程池

背景 在真实的Java开发环境中,我们经常会需要用到定时任务来帮助我们完成一些特殊的任务,比如我最近写的晚上11点定时拉取第三方的数据入库,晚上12点清理脏数据等等。 如果我们使用SpringBoot来开发,那么定时任务将会变得非常简单。SpringBoot默认已经帮我们封装好了相关定时任务的组件和配置,我们只需要在相应的地方加上@Schedule注解就可以实现定时任务。 启动定时任务 SpringBoot项目只需要在启动类上加上@EnableScheduling即可开启定时任务 @SpringBootAp

god-jiang的博客 3490

SpringBoot @Schedule未按时执行问题解决

spring boot定时任务不执行

终身做学习,并予以实践 1633

Springboot集成定时器和多线程异步处理

需求:用@schedule标签进行定时处理逻辑,由于业务处理速度慢,需要每次执行逻辑放在不同的线程里异步执行 springboot集成多线程异步,直接上配置: /** * 线程池异步配置 */ @Configuration @EnableAsync public class ThreadExecutorConfig implements AsyncConfigurer { @Override public Executor getAsyncExecutor()

weixin_43469563的博客 852

@Schedule定时任务+分布式环境,这些坑你一定得注意!!!

来源:juejin.cn/post/7155872110252916766???? 欢迎加入小哈的星球,你将获得:专属的项目实战 /1v1 提问/Java 学习路线 /学习打卡/每月赠书/社群讨论新项目:《从零手撸:仿小红书(微服务架构)》正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...,点击查看项目介绍;《...

犬小哈 331

Springboot @Schedule 多个定时任务积压解决

背景 应用中我们通常采用定时任务不断监听配置文件或者采集一些应用状态信息等等,这些任务通常间隔比较短,频次比较高。随着定时任务增多,定时任务偶尔出现了积压问题,即:定时任务总是顺序执行的,无法并行执行,此时当某个定时任务卡住时,会影响其他定时任务的执行,这样的结果不是我们想看到的。 现象 创建了两个定时任务 TestSchedule1 每 3 秒执行一次 TestSchedule2 每 2 秒执行一次 @Scheduled(cron = "0/3 * * * * ?") public

wozaizhe55 2781

@Schedule定时任务+分布式环境一些踩过的坑~

定时任务的实现方式多种多样,框架也是层出不穷。本文所谈及的是 SpringBoot 本身所带有的@Scheduled实现定时任务的方式。以及采用这种方式,在分布式调度中可能会出现的问题,又针对为什么会发生这种问题?又该如何解决,做出了一些叙述。为了适合每个阶段的读者,我把前面测试的代码都贴出来啦~

java_121388的博客 936
上一篇: Httpclient4.5详解之源码解析和使用四: 连接池内连接的打开和socket绑定
下一篇: 彻底理解javac命令-cp参数
且行且珍惜、
博客等级 码龄12年 12粉丝 34原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值