线程池的getPoolSize()方法只增不减?

在《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的。

你可能感兴趣的:(线程池的getPoolSize()方法只增不减?)