线程池构造方法有几个重要参数:
public ThreadPoolExecutor(int corePoolSize,//核心线程数
int maximumPoolSize,//最大线程数
long keepAliveTime,//当线程数大于核心线程数时,空闲线程存活时间
TimeUnit unit,//空闲时间单位
BlockingQueue workQueue//任务大于线程池数量时,用于保存任务的队列
) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
}
当线程池核心数量不够时,新加入的任务会被存放在队列中,如果队列存满了,线程池会创建更多的线程,直到maximumPoolSize。如果还不足以处理新的任务,则面临一个丢弃策略,默认的丢弃策略是抛异常!
常用的Executors.newCachedThreadPool()和Executors.newFixedThreadPool(n),它的队列都是Integer.MAX_VALUE,所以maximumPoolSize和keepAliveTime参数就没有意义了。
如果要自己实现一个线程自动扩容方案呢?以下代码供大家测试探讨
/**
* Created on 2018/1/26 12:55
*
* Description: [线程池自动扩容]
*
* Company: [xxx]
*
* @