證明線程池ThreadPoolExecutor的核心線程數,最大線程數,隊列長度的關系


關於線程池的幾個參數,很多人不是很清楚如何配置,他們之間是什么關系,我用代碼來證明一下。

package www.itbac.com;

import java.util.concurrent.*;

public class ExecutorTest {
    
    public static void main(String[] args)   {
        // 創建線程池 , 參數含義 :(核心線程數,最大線程數,加開線程的存活時間,時間單位,任務隊列長度)
        ThreadPoolExecutor pool = new ThreadPoolExecutor(5, 8,
                0L, TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue<Runnable>(2));
        
        //設置:任務數 = 3 ~ 11 ,分析:任務數 與 活躍線程數,核心線程數,隊列長度,最大線程數的關系。

        int a = 3;
    
            for (int i = 1; i <= a; i++) {
                int j = i;
                pool.submit(new Runnable() {
                    @Override
                    public void run() {
                        //獲取線程名稱
                        Thread thread = Thread.currentThread();
                        String name = thread.getName();
                        //輸出
                        int activeCount = pool.getActiveCount();
                        System.out.println("任務:"+j+"-----,線程名稱:"+name+"-----活躍線程數:"+activeCount);
                    }
                });
            }
            
        //關閉線程池
        pool.shutdown();

    }
}

 

輸出結果,觀察關系:

//任務數 a = 3 , 活躍線程數3 , 任務數 < 核心線程數。
//任務數 a = 4 , 活躍線程數4 , 任務數 < 核心線程數。
//任務數 a = 5 , 活躍線程數5 , 任務數 = 核心線程數。
//任務數 a = 6 , 活躍線程數5 , 任務數 < 核心線程數5 + 隊列長度2 。
//任務數 a = 7 , 活躍線程數5 , 任務數 = 核心線程數5 + 隊列長度2 。

//任務數 a = 8 , 活躍線程數6 , 任務數 < 最大線程數8 + 隊列長度2 。活躍線程數是在核心線程數5的基礎上,加1個活躍線程。
//任務數 a = 9 , 活躍線程數7 , 任務數 < 最大線程數8 + 隊列長度2 。活躍線程數是在核心線程數5的基礎上,加2個活躍線程。
//任務數 a = 10 , 活躍線程數8 , 任務數 = 最大線程數8 + 隊列長度2 。活躍線程數是在核心線程數5的基礎上,加3個活躍線程。

//任務數 a = 11 , 活躍線程數8 , 任務數 > 最大線程數8 + 隊列長度2 。拋出異常RejectedExecutionException

 

總結:

 

隨着任務數量的增加,會增加活躍的線程數。

當活躍的線程數 =   核心線程數,此時不再增加活躍線程數,而是往任務隊列里堆積。

當任務隊列堆滿了,隨着任務數量的增加,會在核心線程數的基礎上加開線程。

直到活躍線程數 = 最大線程數,就不能增加線程了。

如果此時任務還在增加,則: 任務數11 > 最大線程數8 + 隊列長度2 ,拋出異常RejectedExecutionException,拒絕任務。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM