Executor框架

Executor框架

為了更好的控制多線程,JDK提供了一套線程框架Executor,幫助開發(fā)人員有效地進行線程控制。它們都在java.util.concurrent包中,是JDK并發(fā)包的核心。其中有一個比較重要的類:Executors,他扮演這線程工廠的角色,我們通過Executors可以創(chuàng)建特定功能的線程池。

newFixedThreadPool()方法,該方法返回一個固定數(shù)量的線程池,該方法的線程數(shù)始終不變,當有一個任務提交時,若線程池中空閑,則立即執(zhí)行,若沒有,則會被暫緩在一個任務隊列中等待有空閑的線程去執(zhí)行。數(shù)據(jù)量過大的時候不適用
newSingleThreadExecutor()方法,創(chuàng)建一個線程的線程池,若空閑則執(zhí)行,若沒有空閑線程則暫緩在隊列任務中。
newCachedThreadPool()方法,返回一個可根據(jù)實際情況調(diào)整線程個數(shù)的線程池,不限制最大線程數(shù)量,若有任務,則創(chuàng)建線程,若無任務則不創(chuàng)建線程。如果沒有任務則線程在60s后自動回收(空閑時間60s)。
newScheduledThreadPool()方法,該方法返回一個SchededExecutorService對象,但該線程池可以指定線程的數(shù)量。與第一個差不多但是可做定時Job(任務)。

在上面的四個方法中他們的底層都是通過ThreadPoolExecutor這個方法傳入不同的參數(shù)來實現(xiàn)的

若Executors工廠類無法滿足我們的需求,可以自己去創(chuàng)建自定義的線程池,其實Executors工廠類里面的創(chuàng)建線程方法其內(nèi)部實現(xiàn)均是用了ThreadPoolExecutor這個類,這個類可以自定義線程。構造方法如下:

public ThreadPoolExecutor(int corePoolSize,     //核心的線程數(shù)
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler) {...}

int corePoolSize:表示核心的線程數(shù),這個線程池一旦new出來一個實例就恒定下來了線程的數(shù)量
int maximumPoolSize:表示線程池最大的容量能支持多少個線程
long keepAliveTime:表示當線程池中線程空閑的時候多長時間銷毀的數(shù)值0L表示永遠不失效的
TimeUnit unit:表示當線程池中線程空閑的時候多長時間銷毀的單位
BlockingQueue<Runnable> workQueue:阻塞隊列的實現(xiàn): ArrayBlockingQueue、LinkedBlockingQueue等。
ThreadFactory threadFactory:工廠(恒定的)
RejectedExecutionHandler handler:拒絕的策略

自定義線程池使用詳解:

  • 這個構造方法對于隊列是什么類型的比較關鍵:

在使用有界隊列時:若有新的任務需要執(zhí)行,如果線程池實際線程數(shù)小于corePoolSize,則優(yōu)先創(chuàng)建線程,若大于corePoolSize,則會將任務加入隊列,若隊列已滿,則在總線程數(shù)不大于maximumPoolSize的前提下,創(chuàng)建新的線程,若線程數(shù)大于maximumPoolSize,則執(zhí)行拒絕策略,或其他自定義方式。
無界的任務隊列時:LinkedBlockingQueue。與有界隊列相比,除非系統(tǒng)資源耗盡,否則無界的任務隊列不存在任務入隊失敗的情況。當有新任務到來,系統(tǒng)的線程數(shù)小于corePoolSize時,則新建線程執(zhí)行任務。當達到corePoolSize后,就不會繼續(xù)增加。若后續(xù)仍有新的任務加入,而又沒有空閑的現(xiàn)成資源,則任務直接進入隊列等待。若任務創(chuàng)建和處理的速度差異很大,無界隊列會保持快速增長,直到耗盡系統(tǒng)內(nèi)存。

JDK拒絕策略:

AbortPolicy:直接拋出異常阻止系統(tǒng)正常工作
CallerRunsPolicy:只要線程池未關閉,該策略直接在調(diào)用者線程中,運行當前被丟棄的任務。
DiscardOldestPolicy:丟棄最老的一個請求,嘗試再次提交當前任務。
DiscardPolicy:丟棄無法處理的任務,不給予任何處置。

如果需要自定義拒絕策略可以實現(xiàn)RejectedExecutionHandler接口。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容