从以上截图确实是找到了,而且类型还是 ThreadPoolTaskExecutor 类型的,那可以推断出 Spring 一定是在某个地方创建了一个 ThreadPoolTaskExecutor 类型的 Bean。
果然,在 spring-boot-autoconfigure 2.1.3.RELEASE 中,会在 org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration 中自动创建一个默认的 ThreadPoolTaskExecutor bean,getDefaultExecutor 方法会在容器中找到这个bean,并将其作为默认的 @Async 注解的执行线程池。
这里我为什么要标注版本呢?因为某些低版本的 spring-boot-autoconfigure,是没有 TaskExecutionAutoConfiguration 的,此时 Spring 就会选择 SimpleAsyncTaskExecutor。
org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration

从以上源码可以看出,默认的线程池的参数还可以手动在 properties 中配置,这意味着不需要主动创建线程池的情况下,也可以通过 properties 配置文件更改线程池相关参数。
创建线程池 Bean 的几种方式
1、直接创建一个 Bean 的方式,这貌似是最多人使用的方式,可以创建多个线程池 Bean,使用时指定线程池 Bean 名称:
@Bean("myTaskExecutor_1")
public Executor getThreadPoolTaskExecutor1() {
final ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
// set ...
return executor;
}
@Bean("myTaskExecutor_2")
public Executor getThreadPoolTaskExecutor2() {
final ThreadPoolExecutor executor = new ThreadPoolExecutor();
// set ...
return executor;
}
2、实现 AsyncConfigurer 接口方式:
@Component
public class AsyncConfigurerTest implements AsyncConfigurer {
private static final Logger LOGGER = LoggerFactory.getLogger(AsyncConfigurerTest.class);
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
// set ...
return executor;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return (ex, method, params) -> {
LOGGER.info("Exception message:{}", ex.getMessage(), ex);
LOGGER.info("Method name:{}", method.getName());
for (Object param : params) {
LOGGER.info("Parameter value:{}", param);
}
};
}
}
这种方式可以方便定义异常处理的逻辑,不过从源码分析可以看出,项目中只能存在一个 AsyncConfigurer 的配置,意味着我们只能通过 AsyncConfigurer 配置一个自定义的线程池 Bean。

3、利用 spring-boot-autoconfigure 在 properties 配置线程池参数:
前面讲到了 Spring 默认线程池策略,这里利用 spring-boot-autoconfigure 默认创建一个 ThreadPoolTaskExecutor,通过 properties 自定义线程池相关参数。
这个方式的缺点就是类型固定为 ThreadPoolTaskExecutor,且只能有一个线程池。
总结了很多有关于java面试的资料,希望能够帮助正在学习java的小伙伴。由于资料过多不便发表文章,创作不易,望小伙伴们能够给我一些动力继续创建更好的java类学习资料文章,
请多多支持和关注小作,别忘了点赞+评论+转发。右上角私信我回复【03】即可领取免费学习资料谢谢啦!
