JAVA-執行緒池淺析

x隕落發表於2019-05-05

執行緒池的種類

ThreadPoolExector 自定義執行緒池

引數

ThreadPoolExector的引數

引數名稱 說明 其他
核心執行緒數 執行緒池核心執行緒數量,核心執行緒不會被回收,即使沒有任務執行,也會保持空閒狀態
最大執行緒數 池允許最大的執行緒數,當執行緒數量達到corePoolSize,且workQueue佇列塞滿任務了之後,繼續建立執行緒。 "Isn't this fun?"
keepAliveTime 保持時間 超過corePoolSize之後的“臨時執行緒”的存活時間
unit 保持時間 keepAliveTime的單位
workQueue 阻塞佇列大小 當前執行緒數超過corePoolSize時,新的任務會處在等待狀態,並存在workQueue中,BlockingQueue是一個先進先出的阻塞式佇列實現,底層實現會涉及Java併發的AQS機制
threadFactory 建立執行緒的工廠類,通常我們會自頂一個threadFactory設定執行緒的名稱,這樣我們就可以知道執行緒是由哪個工廠類建立的,可以快速定位
handler 拒絕策略 1、AbortPolicy:為執行緒池預設的拒絕策略,該策略直接拋異常處理2、DiscardOldestPolicy:丟棄佇列中最老的任務3、CallerRunsPolicy:將任務分配給當前執行execute方法執行緒來處理4、DiscardOldestPolicy:丟棄佇列中最老的任務 自定義拒絕策略,只需要實現RejectedExecutionHandler介面即可

使用說明

  1. 核心執行緒數 :執行緒長時間維持的執行緒數量,預設情況下會在新建執行緒池後根據執行緒任務來初始化執行緒,到達核心執行緒數位置,核心執行緒不會被回收。開發者可以使用prestartCoreThread發放跳過初始化執行緒的過程,直接初始化核心執行緒。當核心執行緒都在工作,且workQueue滿了的情況下會建立新的執行緒來執行任務。

  2. 最大執行緒數 :執行緒池允許最多同時進行處理任務的最大執行緒個數 = 核心執行緒數 + 額外執行緒,額外執行緒是會被回收的,具體的回收策略參考後面講解的引數keepAliveTime 、unit。

  3. keepAliveTime、unit:保持時間,額外執行緒的過期時間

  4. workQueue:執行緒任務佇列,一般會使用BlockingQueue

  5. threadFactory:執行緒工廠類,通常我們會自頂一個threadFactory設定執行緒的名稱,這樣我們就可以知道執行緒是由哪個工廠類建立的,可以快速定位

  6. handler:拒絕策略,在佇列滿了之後,新的任務請求進行的處理策略,可以自己實現儲存在mysql裡面或者其他的操作。

Executors建立的執行緒池

名稱 說明 實現 需要關注點
newFixedThreadPool 固定執行緒數的執行緒池 核心執行緒數=最大執行緒數 ,使用LinkedBlockingQueue
newSingleThreadExecutor 單一執行緒的執行緒池 核心執行緒數=最大執行緒數=1 ,使用LinkedBlockingQueu
newCachedThreadPool 快取執行緒池 核心執行緒數=0,最大執行緒數為Integer的最大值,過期時間為60s,使用容器SynchronousQueue
newScheduledThreadPool 定時器執行緒池 核心執行緒數自定義,最大執行緒數為Integer的最大值,過期時間為0,使用容器DelayedWorkQueue

ForkJoinPool執行緒池

使用分拆的思路,將任務進行分解成小的任務,進行任務處理的優化,並且能夠實現執行緒竊取,使用雙端佇列讓執行緒與執行緒間能夠共享任務。具體下篇分析下。

CompletableFuture???

相關文章