@Async注解在SpringBoot中默认线程池是多少?

SSM框架的异步场景,大家都会不约而同使用@async注解。

作为一个知名度如此高的异步注解,大家知道他的默认线程池是多少吗?如何来修改他的线程池数量呢?

本文章与大家一同探讨。

@Async异步方法默认使用Spring创建ThreadPoolTaskExecutor。默认核心线程数:8,最大线程数:Integet.MAX_VALUE,队列使用LinkedBlockingQueue,容量是:Integet.MAX_VALUE,空闲线程保留时间:60s,线程池拒绝策略:AbortPolicy。

@Async异步方法默认使用Spring创建ThreadPoolTaskExecutor(参考TaskExecutionAutoConfiguration),

其中默认核心线程数为8, 默认最大队列和默认最大线程数都是Integer.MAX_VALUE. 创建新线程的条件是队列填满时, 而

这样的配置队列永远不会填满, 如果有@Async注解标注的方法长期占用线程(比如HTTP长连接等待获取结果),

在核心8个线程数占用满了之后, 新的调用就会进入队列, 外部表现为没有执行。

 

如何来修改他的线程池数量呢?

可以手动配置相应属性:

  1. #核心线程数
  2. spring.task.execution.pool.core-size=200
  3. #最大线程数
  4. spring.task.execution.pool.max-size=1000
  5. #空闲线程保留时间
  6. spring.task.execution.pool.keep-alive=3s
  7. #队列容量
  8. spring.task.execution.pool.queue-capacity=1000
  9. #线程名称前缀
  10. spring.task.execution.thread-name-prefix=test-thread-

 

配置类是TaskExecutionProperties【org.springframework.boot.autoconfigure.task.TaskExecutionProperties】

 

 

 

现象:

1. 表面现象: 方法中输出的日志, 日志文件中找不到, 也没有任何报错(即@Async标注的方法没有执行, 也没有报错)

2. 分析现象: 日志中某个时刻之后没有了task-xxx线程的日志

原因:

@Async异步方法默认使用Spring创建ThreadPoolTaskExecutor(参考TaskExecutionAutoConfiguration),

其中默认核心线程数为8, 默认最大队列和默认最大线程数都是Integer.MAX_VALUE. 创建新线程的条件是队列填满时, 而

这样的配置队列永远不会填满, 如果有@Async注解标注的方法长期占用线程(比如HTTP长连接等待获取结果),

在核心8个线程数占用满了之后, 新的调用就会进入队列, 外部表现为没有执行.

解决:

手动配置相应属性即可. 比如

spring.task.execution.pool.queueCapacity=4

spring.task.execution.pool.coreSize=20

备注:

此处没有配置maxSize, 仍是默认的Integer.MAX_VALUE. 如果配置的话, 请考虑达到最大线程数时的处理策略(JUC包查找RejectedExecutionHandler的实现类)

(默认为拒绝执行AbortPolicy, 即抛出异常)

AbortPolicy: 直接抛出java.util.concurrent.RejectedExecutionException异常

CallerRunsPolicy: 主线程直接执行该任务,执行完之后尝试添加下一个任务到线程池中,可以有效降低向线程池内添加任务的速度

DiscardOldestPolicy: 抛弃旧的任务

DiscardPolicy: 抛弃当前任务

截图:

1. ThreadPoolTaskExecutor

2. SpringMonitor的配置属性

3. SpringMonitor的Threads

1、本站所有文档、视频、书籍等资料均由网友分享,本站只负责收集不承担任何技术及版权问题。
2、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除下载链接并致以最深的歉意。
3、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责。
4、一经注册为本站会员,一律视为同意网站规定,本站管理员及版主有权禁止违规用户。
5、蚂蚁编程管理员有权不事先通知发贴者而删除本文。
蚂蚁编程学院 » @Async注解在SpringBoot中默认线程池是多少?

发表评论