JAVA-線程池淺析

線程池的種類

ThreadPoolExector 自定義線程池

參數

ThreadPoolExector的參數mysql

參數名稱 說明 其餘
核心線程數 線程池核心線程數量,核心線程不會被回收,即便沒有任務執行,也會保持空閒狀態
最大線程數 池容許最大的線程數,當線程數量達到corePoolSize,且workQueue隊列塞滿任務了以後,繼續建立線程。 "Isn't this fun?"
keepAliveTime 保持時間 超過corePoolSize以後的「臨時線程」的存活時間
unit 保持時間 keepAliveTime的單位
workQueue 阻塞隊列大小 當前線程數超過corePoolSize時,新的任務會處在等待狀態,並存在workQueue中,BlockingQueue是一個先進先出的阻塞式隊列實現,底層實現會涉及Java併發的AQS機制
threadFactory 建立線程的工廠類,一般咱們會自頂一個threadFactory設置線程的名稱,這樣咱們就能夠知道線程是由哪一個工廠類建立的,能夠快速定位
handler 拒絕策略 一、AbortPolicy:爲線程池默認的拒絕策略,該策略直接拋異常處理二、DiscardOldestPolicy:丟棄隊列中最老的任務三、CallerRunsPolicy:將任務分配給當前執行execute方法線程來處理四、DiscardOldestPolicy:丟棄隊列中最老的任務 自定義拒絕策略,只須要實現RejectedExecutionHandler接口便可

使用說明

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

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

  3. keepAliveTime、unit:保持時間,額外線程的過時時間併發

  4. workQueue:線程任務隊列,通常會使用BlockingQueue優化

  5. threadFactory:線程工廠類,一般咱們會自頂一個threadFactory設置線程的名稱,這樣咱們就能夠知道線程是由哪一個工廠類建立的,能夠快速定位this

  6. handler:拒絕策略,在隊列滿了以後,新的任務請求進行的處理策略,能夠本身實現保存在mysql裏面或者其餘的操做。線程

Executors建立的線程池

名稱 說明 實現 須要關注點
newFixedThreadPool 固定線程數的線程池 核心線程數=最大線程數 ,使用LinkedBlockingQueue
newSingleThreadExecutor 單一線程的線程池 核心線程數=最大線程數=1 ,使用LinkedBlockingQueu
newCachedThreadPool 緩存線程池 核心線程數=0,最大線程數爲Integer的最大值,過時時間爲60s,使用容器SynchronousQueue
newScheduledThreadPool 定時器線程池 核心線程數自定義,最大線程數爲Integer的最大值,過時時間爲0,使用容器DelayedWorkQueue

ForkJoinPool線程池

使用分拆的思路,將任務進行分解成小的任務,進行任務處理的優化,而且可以實現線程竊取,使用雙端隊列讓線程與線程間可以共享任務。具體下篇分析下。rest

CompletableFuture???

相關文章
相關標籤/搜索