当前位置:首页 > 科技  > 软件

解密SpringBoot线程池

来源: 责编: 时间:2023-10-13 14:34:26 173观看
导读哈喽,大家好,我是了不起。我们在日常开发中,经常跟多线程打交道,Spring 为我们提供了一个线程池方便我们开发,它就是 ThreadPoolTaskExecutor ,接下来我们就来聊聊 Spring 的线程池吧。使用@Async声明多线程SpringBoot 提供

哈喽,大家好,我是了不起。O4e28资讯网——每日最新资讯28at.com

我们在日常开发中,经常跟多线程打交道,Spring 为我们提供了一个线程池方便我们开发,它就是 ThreadPoolTaskExecutor ,接下来我们就来聊聊 Spring 的线程池吧。O4e28资讯网——每日最新资讯28at.com

使用@Async声明多线程

SpringBoot 提供了注解 @Async 来使用线程池, 具体使用方法如下:O4e28资讯网——每日最新资讯28at.com

  1. 在启动类(配置类)添加@EnableAsync来开启线程池
  2. 在需要开启子线程的方法上添加注解 @Async

下面是一个简单的例子:O4e28资讯网——每日最新资讯28at.com

@Component@EnableAsync@EnableSchedulingpublic class ScheduleTask {    @Async    @Scheduled(fixedRate = 2000)    public void testAsync1() {        try {            Thread.sleep(6000);            System.out.println(LocalDateTime.now() + "--线程1:" + Thread.currentThread().getName());        } catch (InterruptedException e) {            e.printStackTrace();        }    }    @Async    @Scheduled(cron = "*/2 * * * * ?")    public void testAsync2() {        try {            Thread.sleep(1000);            System.out.println(LocalDateTime.now() + "--线程2:" + Thread.currentThread().getName());        } catch (Exception ex) {            ex.printStackTrace();        }    }}

启动项目,得到如下日志结果:O4e28资讯网——每日最新资讯28at.com

图片图片O4e28资讯网——每日最新资讯28at.com

可以发现在当前环境下 task-${id} 这个 id 并不是一直增长的,而是一直在复用 1-8。这个时候可能就会有的小伙伴们会比较好奇,默认的不是 SimpleAsyncTaskExecutor 吗?为什么从日志打印的效果上看像是一直在复用 8 个线程,难道用的是 ThreadPoolTaskExecutor?O4e28资讯网——每日最新资讯28at.com

原因是 SpringBoot2.1.0 版本后,新增了 TaskExecutionAutoConfiguration 配置类。其中声明的默认线程池就是 ThreadPoolTaskExecutor 。而 @Async 在选择执行器的时候会先去 IOC 容器中先找是否有 TaskExecutor 的 Bean对象,所以在当前版本 SpringBoot 中,@Async 的默认 TaskExecutor 是 ThreadPoolTaskExecutor。O4e28资讯网——每日最新资讯28at.com

线程池配置

在 SpringBoot 项目中,我们可以在 yaml 或者 properties 配置文件中配置,或者使用 @Configuration 配置,下面演示配置方法。O4e28资讯网——每日最新资讯28at.com

  1. application.properties配置文件中配置
# 核心线程池数spring.task.execution.pool.core-size=5# 最大线程池数spring.task.execution.pool.max-size=10# 任务队列的容量spring.task.execution.pool.queue-capacity=5# 非核心线程的存活时间spring.task.execution.pool.keep-alive=60# 线程池的前缀名称spring.task.execution.thread-name-prefix=test-task-
  1. 配置类中配置
@Bean(name = "myThreadPoolTaskExecutor")public ThreadPoolTaskExecutor getMyThreadPoolTaskExecutor() {    ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();    int i = Runtime.getRuntime().availableProcessors();    taskExecutor.setCorePoolSize(i * 2);    taskExecutor.setMaxPoolSize(i * 2);    taskExecutor.setQueueCapacity(i * 2 * 100);    taskExecutor.setKeepAliveSeconds(60);    taskExecutor.setThreadNamePrefix("my-task-");    taskExecutor.initialize();    return taskExecutor;}

拒绝策略

RejectedExectutionHandler 参数字段用于配置绝策略,常用拒绝策略如下O4e28资讯网——每日最新资讯28at.com

  • AbortPolicy:用于被拒绝任务的处理程序,它将抛出RejectedExecutionException
  • CallerRunsPolicy:用于被拒绝任务的处理程序,它直接在execute方法的调用线程中运行被拒绝的任务。
  • DiscardOldestPolicy:用于被拒绝任务的处理程序,它放弃最旧的未处理请求,然后重试execute。
  • DiscardPolicy:用于被拒绝任务的处理程序,默认情况下它将丢弃被拒绝的任务。

处理流程

  1. 查看核心线程池是否已满,不满就创建一条线程执行任务,否则执行第2步。
  2. 查看任务队列是否已满,不满就将任务存储在任务队列中,否则执行第3步。
  3. 查看线程池是否已满,即就是是否达到最大线程池数,不满就创建一条线程执行任务,否则就按照策略处理无法执行的任务。

使用注意

  1. 注解的方法必须是 public 方法。
  2. 方法一定要从另一个类中调用,也就是从类的外部调用,类的内部调用是无效的,因为 @Transactional 和 @Async 注解的实现都是基于 Spring 的 AOP ,而 AOP 的实现是基于动态代理模式实现的。那么注解失效的原因就很明显了,有可能因为调用方法的是对象本身而不是代理对象,因为没有经过 Spring 容器。
  3. 异步方法使用注解 @Async 的返回值只能为 void 或者 Future。

总结

上面简单介绍了 Spring 自带的线程池 ThreadPoolTaskExecutor 的配置和使用,并且讲了线程池的参数和处理流程。当然Spring提供了7个线程池的实现,感兴趣的可以自行了解~O4e28资讯网——每日最新资讯28at.com

本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-13250-0.html解密SpringBoot线程池

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: NET序列化工具:SharpSerializer库快速上手并轻松完成序列化操作

下一篇: Tailwind CSS 真有那么好吗?讨厌它的前六大原因

标签:
  • 热门焦点
  • 卢伟冰长文解析K60至尊版 对Redmi有着里程碑式的意义

    卢伟冰长文解析K60至尊版 对Redmi有着里程碑式的意义

    在今天的Redmi后性能时代战略发布会结束之后,Redmi总经理卢伟冰又带来了一篇长文,详解了为什么 Redmi 要开启后性能时代?为什么选择和 MediaTek、Pixelworks 深度合作?以及后性
  • 2023 年的 Node.js 生态系统

    2023 年的 Node.js 生态系统

    随着技术的不断演进和创新,Node.js 在 2023 年达到了一个新的高度。Node.js 拥有一个庞大的生态系统,可以帮助开发人员更快地实现复杂的应用。本文就来看看 Node.js 最新的生
  • Java NIO内存映射文件:提高文件读写效率的优秀实践!

    Java NIO内存映射文件:提高文件读写效率的优秀实践!

    Java的NIO库提供了内存映射文件的支持,它可以将文件映射到内存中,从而可以更快地读取和写入文件数据。本文将对Java内存映射文件进行详细的介绍和演示。内存映射文件概述内存
  • 每天一道面试题-CPU伪共享

    每天一道面试题-CPU伪共享

    前言:了不起:又到了每天一到面试题的时候了!学弟,最近学习的怎么样啊 了不起学弟:最近学习的还不错,每天都在学习,每天都在进步! 了不起:那你最近学习的什么呢? 了不起学弟:最近在学习C
  • 使用AIGC工具提升安全工作效率

    使用AIGC工具提升安全工作效率

    在日常工作中,安全人员可能会涉及各种各样的安全任务,包括但不限于:开发某些安全工具的插件,满足自己特定的安全需求;自定义github搜索工具,快速查找所需的安全资料、漏洞poc、exp
  • Temu起诉SHEIN,跨境电商战事升级

    Temu起诉SHEIN,跨境电商战事升级

    来源 | 伯虎财经(bohuFN)作者 | 陈平安日前据外媒报道,拼多多旗下跨境电商平台Temu正对竞争对手SHEIN提起新诉讼,诉状称Shein“利用市场支配力量强迫服装厂商与之签订独家
  • 腾讯VS网易,最卷游戏暑期档,谁能笑到最后?

    腾讯VS网易,最卷游戏暑期档,谁能笑到最后?

    作者:无锈钵来源:财经无忌7月16日晚,上海1862时尚艺术中心。伴随着幻象的精准命中,硕大的荧幕之上,比分被定格在了14:12,被寄予厚望的EDG战队以绝对的优势战胜了BLG战队,拿下了总决
  • 携众多高端产品亮相ChinaJoy,小米带来一场科技与人文的视听盛宴

    携众多高端产品亮相ChinaJoy,小米带来一场科技与人文的视听盛宴

    7月28日,全球数字娱乐领域最具知名度与影响力的年度盛会中国国际数码互动娱乐展览会(简称ChinaJoy)在上海新国际博览中心盛大开幕。作为全球领先的科
  • 华为Mate 60保护壳曝光:硕大后置相机模组 凸起程度有惊喜

    华为Mate 60保护壳曝光:硕大后置相机模组 凸起程度有惊喜

    这段时间以来,关于华为新旗舰的爆料日渐密集。据此前多方爆料,今年华为将开始恢复一年双旗舰战略,除上半年推出的P60系列外,往年下半年的Mate系列也将
Top
Baidu
map