溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何進(jìn)行ThreadPoolExecutor的keepAliveTime=0說(shuō)明

發(fā)布時(shí)間:2021-12-17 14:39:03 來(lái)源:億速云 閱讀:410 作者:柒染 欄目:大數(shù)據(jù)

如何進(jìn)行ThreadPoolExecutor的keepAliveTime=0說(shuō)明,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。




解釋   ThreadPoolExecutor的keepAliveTime=0  。

如何進(jìn)行ThreadPoolExecutor的keepAliveTime=0說(shuō)明


上圖來(lái)自《并發(fā)編程的藝術(shù)》一書,書中有下面一段描述:

“  

“當(dāng)線程池中的線程數(shù)大于corePoolSize時(shí),keepAliveTime 為多余的空閑線程等待新任務(wù)的最長(zhǎng)時(shí)間, 超過(guò)這個(gè)時(shí)間后多余的線程將被終止。這里把keepAliveTime設(shè)置為0L,意味著多余 的空閑線程會(huì)被立即終止?!?/p>

網(wǎng)上很多資料都是說(shuō)的0表示在空閑的時(shí)候線程永久存活。其實(shí)是不準(zhǔn)確的。

附上驗(yàn)證代碼:

public static void main(String[] args) throws InterruptedException {
       // 創(chuàng)建了一個(gè)線程池
       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("總線程數(shù):" + executor.getPoolSize() + ", 當(dāng)前活躍線程數(shù):" + 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結(jié)束");
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
           } else {
               try {
                   TimeUnit.SECONDS.sleep(3);
                   System.out.println("num=" + num + " sleep 3 s結(jié)束");
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
           }
       }
   }

 


打印結(jié)果:

num=2 Thread = pool-1-thread-2
總線程數(shù):2, 當(dāng)前活躍線程數(shù):2
num=0 Thread = pool-1-thread-1
num=2 sleep 1 s結(jié)束
num=1 Thread = pool-1-thread-2
總線程數(shù):2, 當(dāng)前活躍線程數(shù):2
num=1 sleep 1 s結(jié)束
總線程數(shù):1, 當(dāng)前活躍線程數(shù):1
num=0 sleep 3 s結(jié)束
總線程數(shù):1, 當(dāng)前活躍線程數(shù):1
總線程數(shù):1, 當(dāng)前活躍線程數(shù):0
總線程數(shù):1, 當(dāng)前活躍線程數(shù):0

關(guān)于如何進(jìn)行ThreadPoolExecutor的keepAliveTime=0說(shuō)明問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI