Java線程池技術(shù)總結(jié)

Java線程池技術(shù)總結(jié)

四種內(nèi)置線程池

newSingleThreadExecutor

創(chuàng)建一個單線程的線程池获黔。這個線程池只有一個線程在工作,也就是相當(dāng)于單線程串行執(zhí)行所有任務(wù)在验。如果這個唯一的線程因為異常結(jié)束玷氏,那么會有一個新的線程來替代它。此線程池保證所有任務(wù)的執(zhí)行順序按照任務(wù)的提交順序執(zhí)行腋舌。

newFixedThreadPool

創(chuàng)建固定大小的線程池盏触。每次提交一個任務(wù)就創(chuàng)建一個線程,直到線程達(dá)到線程池的最大大小块饺。線程池的大小一旦達(dá)到最大值就會保持不變赞辩,如果某個線程因為執(zhí)行異常而結(jié)束,那么線程池會補(bǔ)充一個新線程授艰。

newCachedThreadPool

創(chuàng)建一個可緩存的線程池辨嗽。如果線程池的大小超過了處理任務(wù)所需要的線程,
那么就會回收部分空閑(60秒不執(zhí)行任務(wù))的線程淮腾,當(dāng)任務(wù)數(shù)增加時糟需,此線程池又可以智能的添加新線程來處理任務(wù)。此線程池不會對線程池大小做限制谷朝,線程池大小完全依賴于操作系統(tǒng)(或者說JVM)能夠創(chuàng)建的最大線程大小洲押。

newScheduledThreadPool

創(chuàng)建一個大小無限的線程池。此線程池支持定時以及周期性執(zhí)行任務(wù)的需求圆凰。

自定義線程池

完整的線程池定義如下:

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              RejectedExecutionHandler handler) {
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             Executors.defaultThreadFactory(), handler);
    }
參數(shù) 含義
corePoolSize 線程池維護(hù)線程的最少數(shù)量
maximumPoolSize 線程池維護(hù)線程的最大數(shù)量
keepAliveTime 線程池維護(hù)線程所允許的空閑時間
unit 線程池維護(hù)線程所允許的空閑時間的單位
workQueue 線程池所使用的緩沖隊列
handler 線程池對拒絕任務(wù)的處理策略

當(dāng)調(diào)用 execute()方法添加一個任務(wù)時杈帐,線程池會做如下判斷:

  1. 如果正在運行的線程數(shù)量小于corePoolSize,那么馬上創(chuàng)建線程運行這個任務(wù)专钉。
  2. 如果正在運行的線程數(shù)量大于或等于corePoolSize挑童,那么將這個任務(wù)放入隊列。
  3. 如果這時候隊列滿了跃须,而且正在運行的線程數(shù)量小于maximumPoolSize炮沐,那么還是要創(chuàng)建線程運行這個任務(wù)。
  4. 如果隊列滿了回怜,而且正在運行的線程數(shù)量大于或等于maximumPoolSize大年,那么線程池會拋出異常换薄,告訴調(diào)用者“我不能再接受任務(wù)了”。

四種拒絕處理策略

AbortPolicy

ThreadPoolExecutor.AbortPolicy() 拋出java.util.concurrent.RejectedExecutionException異常

CallerRunsPolicy

ThreadPoolExecutor.CallerRunsPolicy() 重試添加當(dāng)前的任務(wù)翔试,他會自動重復(fù)調(diào)用execute()方法

DiscardOldestPolicy

ThreadPoolExecutor.DiscardOldestPolicy() 拋棄舊的任務(wù)

DiscardPolicy

ThreadPoolExecutor.DiscardPolicy() 拋棄當(dāng)前的任務(wù)

三種隊列策略

SynchronousQueue

直接提交轻要。工作隊列的默認(rèn)選項是SynchronousQueue,它將任務(wù)直接提交給線程而不保持它們垦缅。在此冲泥,如果不存在可用于立即運行任務(wù)的線程,則試圖把任務(wù)加入隊列將失敗凡恍,因此會構(gòu)造一個新的線程怔球。此策略可以避免在處理可能具有內(nèi)部依賴性的請求集時出現(xiàn)鎖。直接提交通常要求無界 maximumPoolSizes 以避免拒絕新提交的任務(wù)闽巩。當(dāng)命令以超過隊列所能處理的平均數(shù)連續(xù)到達(dá)時担汤,此策略允許無界線程具有增長的可能性。

LinkedBlockingQueue

無界隊列隅很。使用無界隊列(例如率碾,不具有預(yù)定義容量的 LinkedBlockingQueue)將導(dǎo)致在所有 corePoolSize 線程都忙時新任務(wù)在隊列中等待。這樣审编,創(chuàng)建的線程就不會超過 corePoolSize歧匈。(因此砰嘁,maximumPoolSize 的值也就無效了。)當(dāng)每個任務(wù)完全獨立于其他任務(wù)矮湘,即任務(wù)執(zhí)行互不影響時,適合于使用無界隊列磕蛇;例如,在 Web 頁服務(wù)器中秀撇。這種排隊可用于處理瞬態(tài)突發(fā)請求,當(dāng)命令以超過隊列所能處理的平均數(shù)連續(xù)到達(dá)時棠绘,此策略允許無界線程具有增長的可能性再扭。

ArrayBlockingQueue

有界隊列。當(dāng)使用有限的 maximumPoolSizes 時让虐,有界隊列(如 ArrayBlockingQueue)有助于防止資源耗盡敦跌,但是可能較難調(diào)整和控制。隊列大小和最大池大小可能需要相互折衷:使用大型隊列和小型池可以最大限度地降低 CPU 使用率麸俘、操作系統(tǒng)資源和上下文切換開銷,但是可能導(dǎo)致人工降低吞吐量从媚。如果任務(wù)頻繁阻塞(例如患整,如果它們是 I/O 邊界),則系統(tǒng)可能為超過您許可的更多線程安排時間各谚。使用小型隊列通常要求較大的池大小,CPU 使用率較高昌渤,但是可能遇到不可接受的調(diào)度開銷,這樣也會降低吞吐量般眉。

未完潜支,待續(xù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末冗酿,一起剝皮案震驚了整個濱河市络断,隨后出現(xiàn)的幾起案子项玛,更是在濱河造成了極大的恐慌,老刑警劉巖躁绸,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件净刮,死亡現(xiàn)場離奇詭異硅则,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)暑认,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門大审,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人粮彤,你說我怎么就攤上這事姜骡。” “怎么了惫周?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵康栈,是天一觀的道長。 經(jīng)常有香客問我漾狼,道長饥臂,這世上最難降的妖魔是什么似踱? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任稽煤,我火速辦了婚禮酵熙,結(jié)果婚禮上驰坊,老公的妹妹穿的比我還像新娘。我一直安慰自己察藐,他們只是感情好舟扎,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著譬猫,像睡著了一般羡疗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上肌索,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天诚亚,我揣著相機(jī)與錄音午乓,去河邊找鬼。 笑死梢灭,一個胖子當(dāng)著我的面吹牛蒸其,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播摸袁,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼靠汁,長吁一口氣:“原來是場噩夢啊……” “哼闽铐!你這毒婦竟也來了奶浦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤隙咸,失蹤者是張志新(化名)和其女友劉穎扎瓶,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體概荷,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡碌燕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年修壕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片慈鸠。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡譬巫,死狀恐怖督笆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情娃肿,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布凭豪,位于F島的核電站嫂伞,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏末早。R本人自食惡果不足惜然磷,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一姿搜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧舅柜,春花似錦躲惰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽塔沃。三九已至,卻和暖如春蛀柴,著一層夾襖步出監(jiān)牢的瞬間鸽疾,已是汗流浹背谅年。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留弄企,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓拘领,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子笆凌,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容