在《Java并发编程的艺术》第九章9.2.5节中,对线程池的参数监控方法有以下描述:
getPoolSize: 线程池的线程数量。如果线程池不销毁的话, 线程池里的线程不会自动销毁,所以这个大小只增不减。
这真的太让人困惑了,明明自己构建线程池要传入的很重要的参数就有保活时间,时间过了,corePoolSize之外的线程难道不会销毁??
于是写了一段粑粑代码简单测了一下:
public class TestForAnyThing {
public static void main(String[] args) throws InterruptedException {
// ThreadPoolExecutor pool = new ThreadPoolExecutor()
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
2,
5,
1,
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(3),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy()
);
TestThread tt = new TestThread();
for (int i = 0; i < 8; i++) {
threadPool.execute(new Thread(tt,""+i));
System.out.println("循环到" + i + " " + threadPool.getPoolSize());
}
Thread.sleep(10000);
System.out.println(threadPool.getPoolSize());
System.out.println(threadPool.getActiveCount());
}
}
class TestThread implements Runnable{
@Override
public void run() {
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
执行结果:
循环到0 1
循环到1 2
循环到2 2
循环到3 2
循环到4 2
循环到5 3
循环到6 4
循环到7 5
2
0
显然getPoolSize()
并非不会减小;
在任务队列满之前,getPoolSize()
最多只有2;当任务都执行完毕了,核心线程外的线程都超时关闭后,getPoolSize()
就只剩下核心的两个线程;
另外,可以看到getActiveCount()
的含义,核心线程如果没有任务执行,即使未关闭,也不算是active的。