Spring Boot运行时能否修改ThreadPoolExecutor线程池的线程数量?
结论
可以在运行时修改ThreadPoolExecutor的线程数量,不过你现有代码存在几处需要修正的问题,调整后即可实现动态调整。
现有代码问题修正
@Value注解写法错误,需要写为@Value("${numberOfThreads}")才能正确读取配置文件中的值,同时属性类型建议改为Integer,避免传入Executors.newFixedThreadPool时出现类型不匹配报错Executors.newFixedThreadPool返回的ThreadPoolExecutor实例默认核心线程数和最大线程数相等,且默认不允许核心线程超时回收
动态调整实现方案
ThreadPoolExecutor本身提供了公开的修改方法,你直接注入该Bean后调用对应方法即可实时生效:
- 修改核心线程数:调用
setCorePoolSize(int corePoolSize)方法 - 修改最大线程数:调用
setMaximumPoolSize(int maximumPoolSize)方法
注意:因为
newFixedThreadPool创建的线程池核心数和最大数默认一致,调整时建议同时修改两个参数,避免配置不匹配达不到预期效果。调整后线程池会自动适配:调大时新任务提交会创建新线程直到达到新的阈值;调小时多余的空闲线程会在空闲后自动回收,正在运行的任务不会被强制中断。
如果需要配合配置中心实现配置变更自动刷新线程数,你可以增加配置变更监听器,监听numberOfThreads配置的变化,变更时主动调用上述两个方法更新线程池参数即可,不需要重新创建线程池Bean。
内容的提问来源于stack exchange,提问作者Pale Blue Dot
相关产品推荐
相关产品推荐

