Java線程池ThreadPoolExecutor的實(shí)現(xiàn)和參數(shù)

接文章Java8線程池——底層為LinkedBlockingQueue的ThreadPoolExecutor劲厌,文章中簡(jiǎn)單介紹了線程池保持線程旬盯,并且從阻塞隊(duì)列中獲取任務(wù)執(zhí)行的流程齐唆。本篇文章詳細(xì)介紹線程池的幾個(gè)重要的參數(shù)蘸泻,以重要參數(shù)為線索更詳細(xì)剖析線程池的實(shí)現(xiàn)細(xì)節(jié)。

參數(shù)corePoolSize——線程池的基本大小

線程池的目標(biāo)大小御滩,即在沒有任務(wù)執(zhí)行時(shí)線程池的大小眶痰,并且只有在工作隊(duì)列滿了的情況下才會(huì)創(chuàng)建超出這個(gè)數(shù)量的線程绢彤。

  1. 沒有任務(wù)執(zhí)行時(shí)線程池的大小,具體說是一個(gè)延時(shí)初始化颈墅,在線程池初始化的時(shí)候蜡镶,并不會(huì)同時(shí)初始化線程,只有當(dāng)任務(wù)到來時(shí)才會(huì)進(jìn)行線程的創(chuàng)建恤筛,并且線程創(chuàng)建后會(huì)把這個(gè)任務(wù)作為其第一個(gè)任務(wù)執(zhí)行官还。
  2. 只有在工作隊(duì)列滿了,這里的隊(duì)列就是線程池中定義的阻塞隊(duì)列毒坛,阻塞隊(duì)列可以設(shè)置大小望伦,默認(rèn)的長度是整型的最大值Integer.MAX_VALUE

參數(shù)maximumPoolSize——線程池的最大線程數(shù)

表示可以同時(shí)活動(dòng)的線程數(shù)量的上限煎殷。如果某個(gè)線程的空閑時(shí)間超過了存活時(shí)間屯伞,那么將被標(biāo)記為可回收的,并且當(dāng)線程池的當(dāng)前大小超過了基本大小時(shí)豪直,這個(gè)線程將被終止劣摇。其實(shí)在實(shí)際之中還有一個(gè)參數(shù)的設(shè)置allowCoreThreadTimeOut,設(shè)置true弓乙,允許線程池中所有的線程超時(shí)末融,這時(shí)不再需要線程數(shù)量超過基本大小這個(gè)判斷條件。
代碼片段如下:

  1. 如何實(shí)現(xiàn)的超時(shí)時(shí)間判斷暇韧?利用阻塞隊(duì)列的等待超時(shí)機(jī)制實(shí)現(xiàn)勾习,如果在設(shè)定的時(shí)間內(nèi)取不到任務(wù),返回null懈玻,會(huì)把變量timedOut設(shè)置為true巧婶,表示已經(jīng)超時(shí)。
Runnable r = timed ?
        workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) :
        workQueue.take();
  1. 在參數(shù)allowCoreThreadTimeOut和判斷當(dāng)前線程是否超過基本大小共同影響下酪刀,設(shè)置timed參數(shù)的值粹舵。
boolean timed = allowCoreThreadTimeOut || wc > corePoolSize;
  1. 變量timedOut和timed同時(shí)為true時(shí),根據(jù)判斷會(huì)終止線程骂倘。否則線程繼續(xù)for循環(huán)進(jìn)行自旋眼滤,等待任務(wù)的到來。
if ((wc > maximumPoolSize || (timed && timedOut)) && (wc > 1 || workQueue.isEmpty())) {
    if (compareAndDecrementWorkerCount(c)
        return null;
    continue;
}

getTask方法如下圖:

參數(shù)keepAliveTime——超出基本大小的線程空閑狀態(tài)的最長時(shí)間

如果變量allowCoreThreadTimeOut設(shè)置為true历涝,所有線程都會(huì)可能超時(shí)诅需,默認(rèn)為false漾唉,只有超出基本大小的線程會(huì)超時(shí)。線程空閑的時(shí)間超過keepAliveTime堰塌,并且線程數(shù)量大于基本大小赵刑,線程會(huì)被終止。具體實(shí)現(xiàn)參看上面參數(shù)maximumPoolSize中講解的代碼场刑。

RejectedExecutionHandler飽和策略

當(dāng)有界隊(duì)列被填滿后般此,飽和策略發(fā)揮作用,可以通過調(diào)用setRejectedExecutionHandler設(shè)置牵现。默認(rèn)策略是拋出未檢查的異常RejectedExecutionException铐懊,調(diào)用者可以捕獲這個(gè)異常,根據(jù)需求處理瞎疼,也可以快速定位到隊(duì)列被填滿科乎。另外,還有策略直接拋棄到來的任務(wù)贼急,或者拋棄下一個(gè)將被執(zhí)行的任務(wù)茅茂,嘗試提交新的任務(wù)。最后還可以實(shí)現(xiàn)將任務(wù)既不遺棄太抓,也不拋出異常空闲,而是把任務(wù)回退給調(diào)用者。在ThreadPoolExecutor中對(duì)應(yīng)的類分別是:AbortPolicy腻异,DiscardPolicy进副,DiscardOldestPolicy和CallerRunsPolicy。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末悔常,一起剝皮案震驚了整個(gè)濱河市影斑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌机打,老刑警劉巖矫户,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異残邀,居然都是意外死亡皆辽,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門芥挣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來驱闷,“玉大人,你說我怎么就攤上這事空免】樟恚” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵蹋砚,是天一觀的道長扼菠。 經(jīng)常有香客問我摄杂,道長,這世上最難降的妖魔是什么循榆? 我笑而不...
    開封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任析恢,我火速辦了婚禮,結(jié)果婚禮上秧饮,老公的妹妹穿的比我還像新娘映挂。我一直安慰自己,他們只是感情好浦楣,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開白布袖肥。 她就那樣靜靜地躺著咪辱,像睡著了一般振劳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上油狂,一...
    開封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天历恐,我揣著相機(jī)與錄音,去河邊找鬼专筷。 笑死弱贼,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的磷蛹。 我是一名探鬼主播吮旅,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼味咳!你這毒婦竟也來了庇勃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤槽驶,失蹤者是張志新(化名)和其女友劉穎责嚷,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掂铐,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡罕拂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了全陨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爆班。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖辱姨,靈堂內(nèi)的尸體忽然破棺而出柿菩,到底是詐尸還是另有隱情,我是刑警寧澤炮叶,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布碗旅,位于F島的核電站渡处,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏祟辟。R本人自食惡果不足惜医瘫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望旧困。 院中可真熱鬧醇份,春花似錦、人聲如沸吼具。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拗盒。三九已至怖竭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間陡蝇,已是汗流浹背痊臭。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留登夫,地道東北人广匙。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像恼策,于是被迫代替她去往敵國和親鸦致。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355