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中定义成员变量,可 阅读详情

相关推荐

从FedAvg到实战:手把手教你用PyTorch复现联邦学习经典论文实验(MNIST/CIFAR-10)

本文详细介绍了如何使用PyTorch复现联邦学习经典算法FedAvg在MNIST和CIFAR-10数据集上的实验。从环境搭建、数据非IID划分到模型实现和参数聚合,手把手教你掌握联邦学习的核心技术与实战技巧,帮助开发者和研究人员快速实现隐私保护的分布式机器学习方案。

weixin_29053695的博客 253

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

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

qq_39173672的博客 3215

莫比乌斯反演

本文从算法竞赛和数论角度出发,系统介绍了狄利克雷卷积与莫比乌斯反演的核心概念。首先定义了数论函数及其基本性质,重点阐述了狄利克雷卷积的代数结构(交换环)和关键恒等式(如μ*1=ε)。随后通过卷积视角简化了莫比乌斯反演的证明过程。最后将理论提升至抽象代数层面,揭示这些数论工具本质上是偏序集关联代数在整除关系下的特例,其中莫比乌斯函数对应Zeta函数的逆元。全文展现了数学概念从具体到抽象的升华过程,为理解这些工具提供了更深刻的代数视角。

aichitang2024的博客 391

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

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

weixin_36098377的博客 193

利用按键精灵实现批量截图与智能命名的高效工作流

本文详细介绍了如何利用按键精灵软件构建高效的批量截图与智能命名自动化工作流。通过基础脚本编写、循环逻辑实现及高级命名策略,解决手动操作耗时易错的问题,帮助用户实现一键自动截图、智能保存与文件重命名,大幅提升软件测试、教程制作及数据报告等场景的工作效率。

weixin_29268267的博客 569

CTF---Web---文件包含---01

文章目录前言一、题目描述二、解题步骤1.查看源代码2.文件包含(/etc/passwd)3.解码总结 前言 题目分类: CTF—Web—文件包含 一、题目描述 题目:提示寻找passwd文件 二、解题步骤 1.查看源代码 提示所有图片存储路径是download.php?name=img, 此时name参数的存在就提示此题可能为“文件包含”。 2.文件包含(/etc/passwd) 两种查看方式: 2.1、访问view-source:http://192.168.87.180/download.php

qq_22160557的博客 1391

Scheduled定时任务异步执行

Scheduled定时任务异步执行

wang20010104的博客 2274

Maya vray 3S皮肤材质球设置与材质节点连接

Maya vray 3S皮肤材质球设置与材质节点连接

WETQETF的博客 2697

Spring使用@Async注解

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

1 2036

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的零售柜商品检测软件(Python+PySide6界面+训练代码)

随着新零售概念的兴起,无人零售柜、智能零售店等新型零售模式快速发展。传统零售柜依赖于人工盘点和补货,效率低下且成本高昂。本文提出了一种基于YOLO系列目标检测算法的零售柜商品检测系统,实现了对零售柜内商品的自动识别、计数和库存管理。系统采用PySide6开发用户界面,集成了YOLOv5、YOLOv6、YOLOv7和YOLOv8等多种先进的深度学习模型,提供了完整的训练和推理流程。本文将详细介绍系统设计、算法实现、数据集构建和实际应用效果,并提供完整的代码实现。

YOLO 333

8、Windows 部署ollama

一个本地运行大模型的集成框架,目前主要针对主流的LLaMA架构的开源大模型设计,通过将模型权重、配置文件和必要数据封装进由Modelfile定义的包中,从而实现大模型的下载、启动和本地运行的自动化部署及推理流程。此外,Ollama内置了一系列针对大模型运行和推理的优化策略,目前作为一个非常热门的大模型托管平台,已被包括LangChain、Taskweaver等在内的多个热门项目高度集成。

Andy_shenzl的博客 1131

@Async @Scheduled的并发问题

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

爱清清的专栏 2037

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

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

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

樂小伍 1万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

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

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

qq_21036901的博客 3914

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

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

Dily_Su的博客 6268

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 2123

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、付费专栏及课程。

余额充值