正确使用@Async,避免踩坑

用法和介绍

功能描述

@Async是Spring提供的使方法异步的注解

使用方法

  • SpringBoot项目启动类增加@EnableAsync注解,开启异步功能
  • 给需要异步的方法增加@Async(“”)注解,一定要指定线程池名称
  • 代码示例

    @EnableAsync@SpringBootApplicationpublic class StartApplication { public static void main(String[] args) { SpringApplication.run(StartApplication.class, args); }}@Servicepublic class AsyncService { /** * 使用默认线程池 */ @Async public void say(){ } /** * 指定线程池名称 */ @Async(“getAsyncExecutor”) public void eat(){ }}@Configurationpublic class MyAsyncConfiguration { //核心线程数 private static final int CORE_POOL_SIZE = 5; //最大线程数 private static final int MAX_POOL_SIZE = 15; //队列大小 private static final int QUEUE_CAPACITY = 100; //线程池中的线程的名称前缀 private static final String THREAD_NAME = “MyThread-“; @Bean public Executor getAsyncExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); //配置核心线程数 executor.setCorePoolSize(CORE_POOL_SIZE); //配置最大线程数 executor.setMaxPoolSize(MAX_POOL_SIZE); //配置队列大小 executor.setQueueCapacity(QUEUE_CAPACITY); //配置线程池中的线程的名称前缀 executor.setThreadNamePrefix(THREAD_NAME); //配置线程池拒绝策略,设置为CallerRunsPolicy,当线程和队列都满了,由发起线程的主线程自己执行 executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); executor.initialize(); return executor; }}

    已实现的TaskExecutor线程池

    • SimpleAsyncTaskExecutor:不是真的线程池,这个类不重用线程,每次调用都会创建一个新的线程。
    • SyncTaskExecutor:这个类没有实现异步调用,只是一个同步操作,只适用于不需要多线程的地方。
    • ConcurrentTaskExecutor:Executor的适配类,不推荐使用。如果ThreadPoolTaskExecutor不满足要求时,才用考虑使用这个类 。
    • SimpleThreadPoolTaskExecutor:是Quartz的SimpleThreadPool的类。线程池同时被quartz和非quartz使用,才需要使用此类。
    • ThreadPoolTaskExecutor :最常使用,推荐。 其实质是对java.util.concurrent.ThreadPoolExecutor的包装。

    为什么说一定要指定线程池名称

    @Async依赖线程池,当我们未指定线程池@Async会如何选择呢?

    1. 当系统未配置任何线程池时

    SpringBoot会默认添加一个coreSize=8的 ThreadPoolTaskExecutor 无界线程池,名称applicationTaskExecutor。

    2. 当只配置了一个TaskExecutor线程池时

    使用此线程池

    3. 当只配置了一个线程池,但不是TaskExecutor线程池时

    使用 SimpleAsyncTaskExecutor 线和池

    4. 当有多个TaskExecutor线程池时

    默认使用 SimpleAsyncTaskExecutor 线程池,如果指定就使用指定的线程池(即使不是TaskExecutor类型的线程池也可以)

    注意:SimpleAsyncTaskExecutor 不是真的线程池,这个类不重用线程,每次调用都会创建一个新的线程。强烈建议开发时指定线程池的名称,避免创建多个TaskExecutor实例后,使用 SimpleAsyncTaskExecutor 线和池的情况发生

    郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
    用户投稿
    上一篇 2022年6月14日 12:29
    下一篇 2022年6月14日 12:29

    相关推荐

    • 分享4条发微商朋友圈的方法(微商朋友圈应该怎么发)

      对于微商朋友来说,朋友圈的重要性不言而喻了。 那么微商的朋友圈到底该怎么发呢? 为什么同样是经营一个朋友圈,有的微商看起来逼格满满,实际效果也不错;而有的却动都不动就被屏蔽甚至拉黑…

      2022年11月27日
    • 全民K歌升级新版本7.0之后,有哪些隐藏功能?

      作者:高百烈来源:知乎 这个功能,旧版并没有,要升级到全新的全民K歌7.0版本才能发现。 作为朋友圈当代K歌之王,我费了不少功夫才抢到内测版本。有一说一,全民K歌的路子真的很野,新…

      2022年11月25日
    • 《宝可梦朱紫》梦特性怎么获得?隐藏特性获取方法推荐

      宝可梦朱紫里有很多宝可梦都是拥有梦特性会变强的宝可梦,很多玩家不知道梦特性怎么获得,下面就给大家带来宝可梦朱紫隐藏特性获取方法推荐,感兴趣的小伙伴一起来看看吧,希望能帮助到大家。 …

      2022年11月25日
    • 《宝可梦朱紫》奇鲁莉安怎么进化?奇鲁莉安进化方法分享

      宝可梦朱紫中的奇鲁莉安要怎么进化呢?很多玩家都不知道,下面就给大家带来宝可梦朱紫奇鲁莉安进化方法分享,感兴趣的小伙伴一起来看看吧,希望能帮助到大家。 奇鲁莉安进化方法分享 奇鲁莉安…

      2022年11月25日
    • 2023年摆地摊卖什么最赚钱而且很受欢迎(2022年摆地摊合法吗)

      关于摆地摊赚钱每年的热度也是非常高的,很多想要做点小本生意的商家也都会选择摆地摊这个项目,所需要的成本也是非常低的。那么,2023年摆地摊卖什么最赚钱而且很受欢迎?今天极客号小编整…

      2022年11月25日
    • 密接5+3是什么意思(密接人员是什么意思)

      如今新冠病例的传播速度是越来越快了,对于感染了新冠病毒的人员来说都会采取隔离观看措施。而据了解,当前国内又对新冠疫情防控政策做了新的调整优化,其中密接管理调整为“5+3”。很多人对…

      2022年11月25日
    • 上手Reno8 Pro体验跨屏互联 实在太方便!

      11月已经来到了月底,在手机品牌又要推出新一年度的新品手机之前,我们来点评一下今年令人惊喜的产品。如OPPO的Reno8 Pro系列,该系列搭载双芯影像配置获得了很多消费者的认可。…

      2022年11月25日
    • 不知道考研真题哪里找?看这里!

      考研备考冲刺阶段,知道大家都很疲惫,但是,别让自己之前的努力白费,再坚持坚持,会看到你想要的结果的。 要是你想考研成功,有一个资料就必须要有。它就是:历年考研真题。 考研真题的重要…

      2022年11月25日
    • 《原神》3.2无相交响诗第一天无相之冰怎么打?无相交响诗攻略

      原神3.2无相交响诗第一天无相之冰怎么打?最近新版本3.2版本的无相交响诗活动又开启了,不少玩家还不清楚具体的玩法,下面一起来看一下原神被隐去的原神3.2无相交响诗第一天无相之冰打…

      2022年11月24日
    • cpu性能天梯图2022 AMD CPU天梯图最新排行榜出炉

      用户在DIY自己的主机时选择CPU是非常关键的,CPU可以说是电脑的大脑,大家也都想追求好一点的CPU来使用,但型号太多了,大部分的用户都不知道目前哪一款CPU比较好用,快来看看详…

      2022年11月24日

    联系我们

    联系邮箱:admin#wlmqw.com
    工作时间:周一至周五,10:30-18:30,节假日休息