线程池的基本认识以及使用示例:https://blog.csdn.net/weixin_39439156/article/details/135099731
在实际生产中我们用线程池的难点很多时候实在配置核心参数时,因为很多时候我们也无法预计生产环境的一个使用情况,可能和我们预估情况有所差别,这时候可能我们就会去动态的去调整我们的核心参数。下面还是先简单介绍一下核心参数,再提供一个动态修改参数的demo。
线程池的核心参数包括: 核心线程数(corePoolSize)、最大线程数(maximumPoolSize)、任务队列(workQueue)、线程存活时间(keepAliveTime):
当有任务提交给线程池时,线程池会按照以下规则执行任务:
当线程池中的线程空闲一段时间后,根据线程存活时间的设置,非核心线程可能会被销毁,以减少资源消耗。
合理配置线程池参数对于获得最佳性能和资源利用至关重要。以下是一些常用的线程池配置建议:
在无法预估线上环境的情况、或者线上环境变化巨大的情况下,我们可以通过ThreadPoolExecutor 提供的set方法
对其核心参数进行动态调整。
/**
* coreSize、maxPoolSize、aliveSeconds 均通过apollo配置
* @return
*/
@Bean("mePoolExecutor")
public ThreadPoolExecutor poolExecutor(){
ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(coreSize,
maxPoolSize,
aliveSeconds,
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(100));
return poolExecutor;
}
实现ConfigChangeListener
,ApplicationListener
监听ApolloConfigChangeEvent
事件,判断是否核心配置参数发生变化,如果是则重新set更新。
public class ListenerApollo implements ConfigChangeListener, ApplicationListener<ApolloConfigChangeEvent> {
@Override
public void onChange(ConfigChangeEvent configChangeEvent) {
//核心线程配置发生变化、重新set
ConfigChange coreSize = configChangeEvent.getChange("corSize");
if( coreSize!= null){
ThreadPoolExecutor executor = SpringUtil.getBean(ThreadPoolExecutor.class);
executor.setCorePoolSize(Integer.valueOf(coreSize.getNewValue()));
}
//最大线程、线程存活时间 配置发生变化、重新set todo 同上
}
@Override
public void onApplicationEvent(ApolloConfigChangeEvent event) {
this.onChange(event.getConfigChangeEvent());
}
}
springboot
的SPI
的机制,将其注册到这里就可以动态的去调成线程池相关的核心参数了