關於線程池的幾個參數,很多人不是很清楚如何配置,他們之間是什么關系,我用代碼來證明一下。
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,拒絕任務。