JDK17 动态设置线程池核心线程数以及最大线程数
在以前使用jdk8的时候,曾经使用过动态线程池,也就是在线程池运行过程中,动态修改其核心程池数以及最大线程数,以控制对三方接口的并发调用。原理也很简单,只需要调用
java.util.concurrent.ThreadPoolExecutor#setCorePoolSize
public void setCorePoolSize(int corePoolSize) {
if (corePoolSize < 0)
throw new IllegalArgumentException();
//实际的修改逻辑
……
}
java.util.concurrent.ThreadPoolExecutor#setMaximumPoolSize
public void setMaximumPoolSize(int maximumPoolSize) {
if (maximumPoolSize <= 0 || maximumPoolSize < corePoolSize)
throw new IllegalArgumentException();
//实际的修改逻辑
……
}
就可以完成对这两个参数的修改。
但是在我们将jdk8切换至jdk17之后,调用这两个方法的地方开始报 IllegalArgumentException。于是进入jdk17源码一探究竟。
public void setCorePoolSize(int corePoolSize) {
if (corePoolSize < 0 || maximumPoolSize < corePoolSize)
throw new IllegalArgumentException();
//省略
}
public void setMaximumPoolSize(int maximumPoolSize) {
if (maximumPoolSize <= 0 || maximumPoolSize < corePoolSize)
throw new IllegalArgumentException();
//省略
}
可以看到jdk17在进行核心线程数修改以及最大线程数修改时,增加了新的判断,要求,设置这两个参数时都必须保证最大线程数 大于等于 核心线程数。
jdk8之前的调用方式
executor.setCorePoolSize(target);
executor.setMaximumPoolSize(target);
jdk17的调用方式
//核心线程数变小
if (corePoolSize > target){
executor.setCorePoolSize(target);
executor.setMaximumPoolSize(target);
}else {
executor.setMaximumPoolSize(target);
executor.setCorePoolSize(target);
}
核心线程数变小,先设置核心线程数再设置最大线程数,反之亦然。