在《Java并發(fā)編程的藝術(shù)》第九章9.2.5節(jié)中诚些,對線程池的參數(shù)監(jiān)控方法有以下描述:
getPoolSize: 線程池的線程數(shù)量。如果線程池不銷毀的話, 線程池里的線程不會自動銷毀,所以這個大小只增不減氢哮。
這真的太讓人困惑了袋毙,明明自己構(gòu)建線程池要傳入的很重要的參數(shù)就有保活時間冗尤,時間過了听盖,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("循環(huán)到" + 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();
}
}
}
執(zhí)行結(jié)果:
循環(huán)到0 1
循環(huán)到1 2
循環(huán)到2 2
循環(huán)到3 2
循環(huán)到4 2
循環(huán)到5 3
循環(huán)到6 4
循環(huán)到7 5
2
0
顯然getPoolSize()
并非不會減邢蹦纭;
在任務隊列滿之前碍讯,getPoolSize()
最多只有2悬蔽;當任務都執(zhí)行完畢了,核心線程外的線程都超時關(guān)閉后捉兴,getPoolSize()
就只剩下核心的兩個線程蝎困;
另外,可以看到getActiveCount()
的含義倍啥,核心線程如果沒有任務執(zhí)行禾乘,即使未關(guān)閉,也不算是active的虽缕。