Async注解的正确使用方式默认线程池行为分析直接使用Async注解且未指定线程池时若容器内无taskExecutor命名的Bean默认采用SimpleAsyncTaskExecutor。该线程池因性能问题不被Spring官方推荐。Spring Boot 2.1.x版本后引入TaskExecutionAutoConfiguration自动配置默认线程池ThreadPoolTaskExecutor核心线程数8采用无界队列。此配置优于SimpleAsyncTaskExecutor但存在条件限制。线程池选择规则当容器中存在自定义Executor类型Bean时TaskExecutionAutoConfiguration不会注册默认线程池。此时若容器中仅有一个Executor类型BeanAsync默认使用该Bean。若存在多个Executor且无taskExecutor命名的Bean系统会提示需指定主候选或命名一个Bean为taskExecutor否则回退到SimpleAsyncTaskExecutor。使用建议对于Spring Boot 2.1.x及以上版本无自定义线程池时自动使用默认ThreadPoolTaskExecutor。存在单个自定义线程池时Async默认绑定该线程池。存在多个自定义线程池时必须通过Primary或命名taskExecutor显式指定否则触发默认回退机制。代码示例ConfigurationpublicclassAsyncConfig{Bean(nametaskExecutor)publicExecutorcustomExecutor(){ThreadPoolTaskExecutorexecutornewThreadPoolTaskExecutor();executor.setCorePoolSize(4);executor.setMaxPoolSize(10);returnexecutor;}}Async注解可以使被修饰的方法成为异步方法简单且方便这篇文章将教你如何正确的使用它 先谈谈大多数人对Aysnc的认识 如果直接使用Async未指定线程池 并且 容器内也没有beanName为taskExecutor的bean则会使用org.springframework.core.task.SimpleAsyncTaskExecutor注这个默认的线程池挺坑的spring官方也不推荐使用 到了springboot2.1.X时代一切都变了新增了一个TaskExecutionAutoConfiguration他的出现让你可以摆脱SimpleAsyncTaskExecutor带来的苦楚 当然只是一定程度上~~~先贴个代码 红框中的是springboot默认给的配置核心8个无界队列等等参数相比SimpleAsyncTaskExecutor还是香了很多不是嘛~~~那是否可以说springboot2.1.X就可以直接使用Async反正不是SimpleAsyncTaskExecutor了 这句话是不全对的有场景限制 你看看这里还“藏着”一个ConditionalOnMissingBean表明只要在容器中有Executor这类型得bean就不会再去注册它 例如如下代码在项目中手动定义了一个Executor类型的bean并注入到容器中 问题1 那是不是只要容器中有自定义的Executor类型得bean那Async就又会使用SimpleAsyncTaskExecutor了呢 并不是再看一下代码 这里会去容器中取如果取不到或者取到了多个会异常则返回null那最终使用的就是SimpleAsyncTaskExecutor了 这里回复下问题1 如果容器中有Executor类型的bean那么springboot就不会给我们往容器中注册默认Executor类型bean这时直接使用Async和Async(线程池bean名)是使用的同一个线程池 那问题来了如果我自定义多个Executor类型得bean并且都注册到容器中会发生什么呢 那就会打印一段描述信息给与我们一些提示Morethan oneTaskExecutorbean found within the context,and none is namedutaskExecutor.Markone of them as primary or name it taskExecutor(possibly as an alias)in ordertouseitforasync processing:exgetBeanNamesFound()这里表明容器内必须得有一个beanName为 taskExecutor的线程池否则那就回到最初的起点使用SimpleAsyncTaskExecutor总结一下上述 前提使用的springboot2.1.X及以上版本1.项目没有自定义Executor注册到容器那么Async使用的是springboot默认配置的ThreadPoolTaskExecutor2.项目如果有自定义Executor且只自定义了一个那么Async则默认使用的就是它3.项目中自定义了多个Executor且没有一个beanName为taskExecutor那么则会使用SimpleAsyncTaskExecut