Executor框架

Executor框架簡介

Executor框架的兩級調度模型

Java多線程程序通常把應用分解為若干個任務扳缕,然后使用用戶級的調度器(Executor框架)將這些任務映射為固定數(shù)量的線程;在底層驴剔,操作系統(tǒng)內核將這些線程映射到硬件處理器上粥庄。被稱為兩級調度模型丧失。

Executor框架的結構與成員

  1. Executor框架的結構
    Executor框架主要由3大部分組件組成:
  • 任務: 包括被執(zhí)行任務需要實現(xiàn)的接口:Runnable接口或Callable接口
  • 任務的執(zhí)行利花。包括任務執(zhí)行機制的核心接口Executor载佳,以及繼承自Executor的ExecutorService接口。Executor框架有兩個關鍵實現(xiàn)類實現(xiàn)了ExecutorService接口蔫慧,ThreadPoolExecutorScheduledThreadPoolExecutor
    下面是這些類和接口的簡介:
  • Executor是一個接口,它是Executor框架的基礎睡扬,它將任務的提交與任務的執(zhí)行分離
  • ThreadPoolExecutor是線程池的核心實現(xiàn)類,用來執(zhí)行被提交的任務
  • ScheduledThreadPoolExecutor是一個實現(xiàn)類卖怜,可以在給定的延遲后運行命令,或者定期執(zhí)行命令奄抽。功能類似 于Timer甩鳄,但比Timer更靈活,功能更強大
  • Future接口和實現(xiàn)Future接口的FutureTask類妙啃,代表異步計算的結果
    Runnable接口和Callable接口的實現(xiàn)類,都可以被ThreadPoolExecutor或ScheduledThreadPoolExecutor執(zhí)行

ThreadPoolExector詳解

關于ThreadPoolExector的4個組件構成已經在java線程池實現(xiàn)原理中介紹過馆匿,在此不再重復储笑,下面介紹通過Exectors框架的工具類Exectors可以創(chuàng)建的3種類型的ThreadPoolExector:

  • FixedThreadPool
public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }

FixedThreadPool的corePoolSize和maximumPoolSize都被設置為創(chuàng)建FixedThreadPool時指定的參數(shù)nThreads。
當線程池中的線程數(shù)大于corePoolSize時,keepAliveTime為多余的空閑線程等待新任務的最長時間盆昙,超過這個時間后多余的線程將被終止。這里把keepAliveTime設置為0L秕磷,意味著多余的空閑線程會被立即終止炼团。
FixedThreadPool使用無界隊列LinkedBlockingQueue作為線程池的工作隊列(隊列的容量為Integer.MAX_VALUE)。使用無界隊列作為工作隊列會對線程池帶來如下影響瘟芝。

  1. 當線程池中的線程數(shù)達到corePoolSize后,新任務將在無界隊列中等待晤郑,因此線程池中線程數(shù)不會超過corePoolSize。
  2. 由于1造寝,使用無界隊列時maximumPoolSize將是一個無效參數(shù)。
  3. 由于1和2析显,使用無界隊列時keepAliveTime將是一個無效參數(shù)签赃。
  4. 由于使用無界隊列,運行中的FixedThreadPool(未執(zhí)行shutDown()或shutDownNow())不會拒絕任務(不會調用RejectedExecutionHandler.rejectedExecution方法)
  • SingleThreadExecutor
    SingleThreadExecutor是使用單個worker線程的Executor姊舵。
public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
    }

SingleThreadExecutor的corePoolSize和maximumPoolSize被設置為1.其他參數(shù)與FixedThreadPool相同括丁。所以SingleThreadExecutor使用無界隊列作為工作隊列對線程池帶來的影響與FixedThreadPool相同。

  • CachedThreadPool
    CachedThreadPool是一個會根據(jù)需要創(chuàng)建新線程的線程池史飞。
public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>());
    }

CachedThreadPool的corePoolSize被設置成0,即corePoolSize為空抽诉;maximumPoolSize被設置為Integer.MAX_VALUE吐绵,即maximumPool是無界的。這里把keepAliveTime設置為60L己单,意味著CachedThreadPool中的空閑線程等待任務的最長時間為60s,空閑線程超過60s后將會被終止纹份。
CachedThreadPool使用沒有沒有容量的SynchronousQueue作為線程池工作隊列廷痘,但CachedThreadPool的maximumPool是無界的。這意味著笋额,如果主線程提交任務的速度高于maximumPool中線程處理任務的速度時,CachedThreadPool就會不斷地創(chuàng)建新任務昨寞。極端情況下,CachedThreadPool會因為創(chuàng)建過多線程而耗盡CPU和內存資源援岩。

In The End

對比
corePoolSize maximumPoolSize workQueue keepAliveTime 特點
FixedThreadPool nTread nTread LinkedBlockingQueue 0 不會拒絕任務
SingleThreadExecutor 1 1 LinkedBlockingQueue 0 只有單個worker線程
CachedThreadPool 0 Integer.MAX_VALUE SynchronousQueue 60 使用阻塞隊列享怀; maximumPoolSize無界
適用場景

FixedThreadPool:由于FixedThreadPool使用無界隊列,所以不會拒絕任務添瓷。因此合理設置corePoolSize數(shù)量配合任務隊列梅屉,適用于負載比較重的服務器鳞贷。
SingleThreadExecutor:SingleThreadExecutor只有一個worker線程,所以提交到SingleThreadExecutor的任務會保證順序的執(zhí)行惰聂,因此SingleThreadExecutor適用于需要保證順序的執(zhí)行任務咱筛,并且整個生命周期不會有多個線程的場景。
CachedThreadPool:CachedThreadPool時大小無界的線程池迅箩,因此適用于執(zhí)行很多短期異步任務的小程序饲趋,或者是負載較輕的服務器。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末奕塑,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌息楔,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件圃泡,死亡現(xiàn)場離奇詭異愿险,居然都是意外死亡价说,警方通過查閱死者的電腦和手機风秤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缤弦,“玉大人,你說我怎么就攤上這事狸捅±厶幔” “怎么了尘喝?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵朽褪,是天一觀的道長鳍贾。 經常有香客問我,道長骑科,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任梁棠,我火速辦了婚禮斗埂,結果婚禮上,老公的妹妹穿的比我還像新娘呛凶。我一直安慰自己,他們只是感情好模闲,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布崭捍。 她就那樣靜靜地躺著,像睡著了一般实夹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上亮航,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天塞赂,我揣著相機與錄音泪勒,去河邊找鬼宴猾。 笑死,一個胖子當著我的面吹牛沦辙,可吹牛的內容都是我干的讹剔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼陌兑,長吁一口氣:“原來是場噩夢啊……” “哼由捎!你這毒婦竟也來了兔综?” 一聲冷哼從身側響起狞玛,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤心肪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后硬鞍,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡碑隆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年蹬音,在試婚紗的時候發(fā)現(xiàn)自己被綠了休玩。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片劫狠。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡独泞,死狀恐怖,靈堂內的尸體忽然破棺而出懦砂,到底是詐尸還是另有隱情组橄,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布玉工,位于F島的核電站,受9級特大地震影響屠升,放射性物質發(fā)生泄漏狭郑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一脏答、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧以蕴,春花似錦辛孵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽习劫。三九已至嚼隘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間飞蛹,已是汗流浹背灸眼。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工墓懂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人捕仔。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓榜跌,卻偏偏與公主長得像,于是被迫代替她去往敵國和親斜做。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內容

  • 本文是我自己在秋招復習時的讀書筆記笼吟,整理的知識點霸旗,也是為了防止忘記,尊重勞動成果诱告,轉載注明出處哦!如果你也喜歡锄禽,那...
    波波波先森閱讀 11,258評論 4 56
  • 一 用線程池好處 限制和管理資源(執(zhí)行任務)靴姿。 維護統(tǒng)計信息,如已完成任務數(shù)佛吓。 1)重復利用已創(chuàng)建線程降低線程創(chuàng)建...
    hedgehog1112閱讀 828評論 0 0
  • 在Java中,使用線程來異步執(zhí)行任務淤刃。Java線程的創(chuàng)建與銷毀需要一定的開銷吱型,如果我們?yōu)槊恳粋€任務創(chuàng)建一個新線程來...
    Steven1997閱讀 750評論 0 0
  • Executor 框架結構 Executor 框架主要由 3 大部分組成如下。任務。包括被執(zhí)行任務需要實現(xiàn)的接口:...
    MPPC閱讀 449評論 0 0
  • 鴉片戰(zhàn)爭后掂名,中國的大門被打開哟沫。列強對近代中國的侵略在加深民族危機的同時锌介,激化了階級矛盾。在這種背景下孔祸,屢試不中的洪...
    王子市閱讀 8,916評論 0 0