int arg1=2;//核心線程 int arg2=40;//最大線程數量 int arg3=100;//空余保留時間 ThreadPoolExecutor pool=new ThreadPoolExecutor(arg1, arg2, arg3,TimeUnit.MILLISECONDS, // 時間單位
new LinkedBlockingQueue<Runnable>());//默認構造的隊列大小為Integer.Max, 可指定大小new LinkedBlockingQueue<Runnable>(3),隊列容量為3
for(int i=0;i<10;i++){
pool.execute(new Mythread(String.valueOf(i)));
}
在自定義的Mythread類的run方法中休眠一段時間(5秒),來模擬執行的任務,我原以為循環了10次,執行10個任務,由於小於最大線程數量40,線程池應該會新建10個線程來執行這10個任務,但是實驗結果發現線程池中只有2個線程(即兩個核心線程)來執行這10個任務,所以共執行了5*10/2=25s時間,而不是我想象中的5s。
原因在於,LinkedBlockingQueue的容量默認大小是Integer.Max,在任務沒有填滿這個容量之前線程池大小是不會超過設定的核心線程數量2的。
當制定LinkedBlockingQueue長度為3時,這10個線程任務有兩個在核心線程中執行,有3個放在任務隊列中,另外5個任務將另起新線程來執行。
總結來說:核心線程滿了,接下來進隊列,隊列也滿了,創建新線程,直到達到最大線程數,之后再超出,會進入拒絕rejectedExecution