1. 程式人生 > 其它 >執行緒池的核心元件及執行機制

執行緒池的核心元件及執行機制

  • 簡介
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();
    }

}

# 控制檯列印成功