關於執行緒池的幾個引數,很多人不是很清楚如何配置,他們之間是什麼關係,我用程式碼來證明一下。
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,拒絕任務。