import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* 动态线程池
*/
public class DynamicThreadPool extends ThreadPoolExecutor {
private final Object lock = new Object();
private int minPoolSize;
public DynamicThreadPool(int corePoolSize, int maximumPoolSize,
long keepAliveTime, TimeUnit unit,
BlockingQueue<Runnable> workQueue) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
this.minPoolSize = corePoolSize;
}
public DynamicThreadPool(int corePoolSize, int maximumPoolSize,
long keepAliveTime, TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory);
this.minPoolSize = corePoolSize;
}
/**
* 设置新的核心线程数
*/
public void setCorePoolSize(int newCorePoolSize) {
if (newCorePoolSize < 0) {
throw new IllegalArgumentException("核心线程数不能为负数");
}
if (newCorePoolSize > getMaximumPoolSize()) {
throw new IllegalArgumentException("核心线程数不能大于最大线程数");
}
synchronized (lock) {
this.minPoolSize = newCorePoolSize;
super.setCorePoolSize(newCorePoolSize);
}
}
/**
* 设置新的最大线程数
*/
public void setMaximumPoolSize(int newMaximumPoolSize) {
if (newMaximumPoolSize <= 0) {
throw new IllegalArgumentException("最大线程数必须为正数");
}
if (newMaximumPoolSize < getCorePoolSize()) {
throw new IllegalArgumentException("最大线程数不能小于核心线程数");
}
synchronized (lock) {
super.setMaximumPoolSize(newMaximumPoolSize);
}
}
/**
* 获取最小线程数
*/
public int getMinPoolSize() {
return minPoolSize;
}
}