執行緒池的核心元件及執行機制
阿新 • • 發佈:2022-05-16
- 簡介
corePoolSize:核心執行緒池大小 cSize maximumPoolSize:執行緒池最大容量 mSize keepAliveTime:當執行緒數量大於核心時,多餘的空閒執行緒在終止之前等待新任務的最大時間 unit:時間單位 workQueue: 工作佇列 nWorks ThreadFactory:執行緒工廠 handler:拒絕策略 執行機制如下: 通過new建立執行緒池時,除非呼叫prestartAllCoreThreads方法初始化核心執行緒,否則此時執行緒池中有0個執行緒,即使工作佇列中存在多個任務,同樣不會執行 任務數X x <= cSize 只啟動x個執行緒 x >= cSize && x < nWorks + cSize 會啟動 <= cSize 個執行緒 其他的任務就放到工作佇列裡 x > cSize && x > nWorks + cSize x-(nWorks) <= mSize 會啟動x-(nWorks)個執行緒 x-(nWorks) > mSize 會啟動mSize個執行緒來執行任務,其餘的執行相應的拒絕策略
- 案例1
public class ThreadPoolDemo { public static void main(String[] args) throws ExecutionException, InterruptedException { // 建立佇列,佇列大小指定20 LinkedBlockingQueue<Runnable> objects = new LinkedBlockingQueue<>(); // 往執行緒池中放入執行緒 for (int i = 0; i <100 ; i++) { objects.put(()->{ System.out.println(Thread.currentThread().getName()); }); } // 建立執行緒池,每次處理10個任務,3秒 ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10, 20, 3L, TimeUnit.SECONDS, objects); } } # 控制檯:不會執行
- 案例2
public class ThreadPoolDemo { public static void main(String[] args) throws ExecutionException, InterruptedException { // 建立佇列,佇列大小指定20 LinkedBlockingQueue<Runnable> objects = new LinkedBlockingQueue<>(); // 往執行緒池中放入執行緒 for (int i = 0; i <100 ; i++) { objects.put(()->{ System.out.println(Thread.currentThread().getName()); }); } // 建立執行緒池,每次處理10個任務,3秒 ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10, 20, 3L, TimeUnit.SECONDS, objects); // 初始化核心執行緒 threadPoolExecutor.prestartAllCoreThreads(); } } # 控制檯列印成功