这个坑不是我挖的,我是无意间看到已离职同事的代码,这个代码是两年前写的了,声明的线程池方式如下:
private static final ThreadPoolExecutor threadPool = new ThreadPoolExecutor(0,
100, 60L, TimeUnit.SECONDS,new LinkedBlockingQueue<Runnable>());
如果你能一眼看出问题,那就不需要往下看了。
坑就出在这个五个参数上,依次如下:
corePoolSize(核心线程池): 0
maximumPoolSize(最大线程池): 100
keepAliveTime(空闲线程保留时间): 60
timeUnit(时间单位): 秒
workQueue(阻塞队列): LinkedBlockingQueue
虽然上面的corePoolSize设置为0,但是至少会有一个线程,所以在实际运行时线程池中会有一个线程。
按上面这个方式初始化的线程池,线程池里面永远只会有一个线程在处理。
因为当线程数量达到corePoolSize后,阻塞队列被占满后才会继续创建线程(线程数<maximumPoolSize),上面阻塞队列采用的是无界对列LinkedBlockingQueue,不可能占满,所以maximumPoolSize参数也相当于无效了。
测试程序:
public class ThreadPoolTest {
private static ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(3, 10