| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> springboot整合异步任务——@Async注解 -> 正文阅读 |
|
[Java知识库]springboot整合异步任务——@Async注解 |
目录 ? 1.简单介绍异步任务:有时候在某个调用中,我们需要调用 A, B, C三个业务流程;如他们都是同步调用,则需要将他们都顺序执行完毕之后,方才算作过程执行完毕,需要A+B+C三个业务一共的执行时间;但如果就我们可以让A、B、C三个业务异步同时执行(前提是三个任务没有先后顺序关系),那么我们就只需要A、B、C三个业务中执行时间最长的那个任务的时间即可执行完毕。这就是异步执行任务。 在Spring中,基于@Async标注的方法,称之为异步方法;这些方法将在执行的时候,将会在独立的线程中被执行,调用者无需等待它的完成,即可继续其他的操作 。 @Async?的原理是通过 Spring? AOP动态代理?的方式来实现的。Spring容器启动初始化bean时,判断类中是否使用了@Async?注解:如果使用了,则为其创建切入点和切入点处理器,根据切入点创建代理,在线程调用@Async注解标注的方法时,会调用代理,执行切入点处理器invoke方法,将方法的执行提交给线程池中的另外一个线程来处理,从而实现了异步执行。 2.springboot开启异步任务首先,我们需要编写自己的线程池,避免spring自身不断地创建线程,导致内存溢出等问题。 自定义线程池的方法有两种,可自行进行选择: (1)application.xml中配置:
此方式还需要在启动类中添加 @EnableAsync 注解,表示开启异步任务。 (2)编写配置类: (建议使用该方法)
其中 ThreadPoolTaskExecutor类是spring封装的线程池包,其使用方式与java juc包下的ThreadPoolExecutor 类相似。 而关于线程池中线程的分配,流程如下: 以上述代码中线程池为例(10 core,50 max,100 queue),当200个并发同时进来时,首先会占用10个核心线程,然后100个进入缓冲队列,缓冲队列满了后,根据max 再打开新线程40个,剩下50个则会根据丢弃策略进行丢弃。 然后,我们只需要在对应的业务类中的方法是标记 @Async注解即可开启异步任务:
关于@Async注解注解:
3.实验验证业务类中添加任务2代码:
在控制类中编写如下代码,进行验证:
?当任务1和任务2不开启异步任务时,顺序执行,效果如下: 而当任务1和任务2开启异步任务后,效果如下: 可以看到并没有顺序执行,遇到异步任务后新开了一个线程执行,然后直接执行main线程中的代码;任务1和任务2则是同时开始执行,成功异步执行。 值得注意的是,如果controller的方法中设置了返回值,且返回值和异步方法的返回值无关(或无返回值)执行时会不等异步方法执行完,先返回结果至前端。 修改控制类中代码,改为循环执行任务1:
可以看到10个任务同时异步开始执行。 此处需要注意的是同时并发的任务数不要超过缓冲队列数+最大线程数,否则在分配完线程资源后会抛出异常。具体如何设置线程池,还需要根据实际情况考虑。 4.注意事项如下方式会使@Async注解失效
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/30 13:59:08- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |