您好,登錄后才能下訂單哦!
如何進行ThreadPoolExecutor的keepAliveTime=0說明,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
上圖來自《并發編程的藝術》一書,書中有下面一段描述:
““當線程池中的線程數大于corePoolSize時,keepAliveTime 為多余的空閑線程等待新任務的最長時間, 超過這個時間后多余的線程將被終止。這里把keepAliveTime設置為0L,意味著多余 的空閑線程會被立即終止。”
網上很多資料都是說的0表示在空閑的時候線程永久存活。其實是不準確的。
附上驗證代碼:
public static void main(String[] args) throws InterruptedException {
// 創建了一個線程池
ThreadPoolExecutor executor = new ThreadPoolExecutor(1,
2,
0, TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>(1));
for (int i = 0; i < 3; i++) {
executor.execute(new DemoTask(i));
}
while (true) {
System.out.println("總線程數:" + executor.getPoolSize() + ", 當前活躍線程數:" + executor.getActiveCount());
TimeUnit.SECONDS.sleep(1);
}
}
static class DemoTask implements Runnable {
int num;
public DemoTask(int i) {
this.num = i;
}
@Override
public void run() {
System.out.println("num=" + num + " Thread = " + Thread.currentThread().getName());
if (num >= 1) {
try {
TimeUnit.SECONDS.sleep(1);
System.out.println("num=" + num + " sleep 1 s結束");
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
try {
TimeUnit.SECONDS.sleep(3);
System.out.println("num=" + num + " sleep 3 s結束");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
打印結果:
num=2 Thread = pool-1-thread-2
總線程數:2, 當前活躍線程數:2
num=0 Thread = pool-1-thread-1
num=2 sleep 1 s結束
num=1 Thread = pool-1-thread-2
總線程數:2, 當前活躍線程數:2
num=1 sleep 1 s結束
總線程數:1, 當前活躍線程數:1
num=0 sleep 3 s結束
總線程數:1, 當前活躍線程數:1
總線程數:1, 當前活躍線程數:0
總線程數:1, 當前活躍線程數:0
關于如何進行ThreadPoolExecutor的keepAliveTime=0說明問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。