證明執行緒池ThreadPoolExecutor的核心執行緒數,最大執行緒數,佇列長度的關係

北溪發表於2019-08-05

關於執行緒池的幾個引數,很多人不是很清楚如何配置,他們之間是什麼關係,我用程式碼來證明一下。

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,拒絕任務。

 

相關文章