Java執行緒池底層原始碼分享和相關面試題(持續更新)

頭髮少少少。發表於2021-06-14

1.執行緒池各個引數講解

public ThreadPoolExecutor(int corePoolSize, //執行緒池核心工作執行緒數量,比如newFixedThreadPool中可以自定義的執行緒數量就是這個引數
                              int maximumPoolSize, //執行緒池所有工作執行緒的數量,比如newFixedThreadPool中的最大工作執行緒就是核心執行緒數,newCachedThreadPool中的最大工作執行緒數是Integer.MAX_VALUE
                              long keepAliveTime, //非核心執行緒存活的時間,當核心執行緒不夠用的時候,建立出來的輔助工作執行緒在完成任務空閒多久後會被回收
                              TimeUnit unit, //上面一個引數的單位,分。秒等
                              BlockingQueue<Runnable> workQueue,//底層使用的阻塞佇列資料結構,比如newFixedThreadPool底層使用LinkedBlockingQueue。工作佇列,儲存已提交但是未執行的任務
                              ThreadFactory threadFactory, //建立工作執行緒的工廠,保持預設即可
                              RejectedExecutionHandler handler) { //拒絕策略,即在所有工作執行緒數達到上限,底層阻塞佇列也滿了的時候採取的策略
        if (corePoolSize < 0 ||
            maximumPoolSize <= 0 ||
            maximumPoolSize < corePoolSize ||
            keepAliveTime < 0)
            throw new IllegalArgumentException();
        if (workQueue == null || threadFactory == null || handler == null)
            throw new NullPointerException();
        this.acc = System.getSecurityManager() == null ?
                null :
                AccessController.getContext();
        this.corePoolSize = corePoolSize;
        this.maximumPoolSize = maximumPoolSize;
        this.workQueue = workQueue;
        this.keepAliveTime = unit.toNanos(keepAliveTime);
        this.threadFactory = threadFactory;
        this.handler = handler;
    }

2.常用執行緒池

1.newSingleThreadExecutor 單個執行緒的執行緒池,即執行緒池中每次只有一個執行緒工作,單執行緒序列執行任務

2.newFixedThreadExecutor(n) 固定數量的執行緒池,沒提交一個任務就是一個執行緒,直到達到執行緒池的最大數量,然後後面進入等待佇列直到前面的任務完成才繼續執行

3.newCacheThreadExecutor(推薦使用) 可快取執行緒池,當執行緒池大小超過了處理任務所需的執行緒,那麼就會回收部分空閒(一般是60秒無執行)的執行緒,當有任務來時,又智慧的新增新執行緒來執行。

4.newScheduleThreadExecutor 大小無限制的執行緒池,支援定時和週期性的執行執行緒

3.執行緒池底層執行原理

 

相關文章