線程池,使用ThreadPoolExecutor代替Executors創(chuàng)建方式

image.png

合理使用線程池的好處:

  • 降低資源消耗伙单。通過重復(fù)利用已創(chuàng)建的線程降低線程創(chuàng)建和銷毀造成的消耗获高。
  • 提高響應(yīng)速度。當(dāng)任務(wù)到達(dá)時车份,任務(wù)可以不需要的等到線程創(chuàng)建就能立即執(zhí)行谋减。
  • 提高線程的可管理性牡彻。線程是稀缺資源扫沼,如果無限制的創(chuàng)建,不僅會消耗系統(tǒng)資源庄吼,還會降低系統(tǒng)的穩(wěn)定性缎除,使用線程池可以進(jìn)行統(tǒng)一的分配,調(diào)優(yōu)和監(jiān)控总寻。但是要做到合理的利用線程池器罐,必須對其原理了如指掌

Executor架構(gòu)

image.png

在HotSpot虛擬機中,Java中的線程將會被一一映射為操作系統(tǒng)的線程 在Java虛擬機層面渐行,用戶將多個任務(wù)提交給Executor框架,Executor負(fù)責(zé)分配線程執(zhí)行它們轰坊; 在操作系統(tǒng)層面,操作系統(tǒng)再將這些線程分配給處理器執(zhí)行


image.png

Executor框架中的所有類可以分成三類:
1.任務(wù) 任務(wù)有兩種類型:Runnable和Callable祟印。
2.任務(wù)執(zhí)行器 Executor框架最核心的接口是Executor肴沫,它表示任務(wù)的執(zhí)行器。
Executor的子接口為ExecutorService蕴忆。
ExecutorService有兩大實現(xiàn)類:ThreadPoolExecutor和ScheduledThreadPoolExecutor颤芬。
3.執(zhí)行結(jié)果
Future接口表示異步的執(zhí)行結(jié)果,它的實現(xiàn)類為FutureTask套鹅。

ThreadPoolExecutor類

image.png

Executor接口

Executor接口只有一個execute方法站蝠,用來替代通常創(chuàng)建或啟動線程的方法。

ExecutorService接口

ExecutorService接口繼承自Executor接口卓鹿,提供了管理終止的方法菱魔,以及可為跟蹤一個或多個異步任務(wù)執(zhí)行狀況而生成 Future 的方法。增加了shutDown()吟孙,shutDownNow()豌习,invokeAll()存谎,invokeAny()和submit()等方法。如果需要支持即時關(guān)閉肥隆,也就是shutDownNow()方法既荚,則任務(wù)需要正確處理中斷。

AbstractExecutorService抽象類

提供ExecutorService接口的默認(rèn)實現(xiàn)方法栋艳。

創(chuàng)建線程池的方法

ExecutorService threadPool = new ThreadPoolExecutor(1, 5, 30, TimeUnit.MILLISECONDS,new LinkedBlockingDeque<Runnable>(1024), Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());

其中線程工廠可以使用guava包中的方法創(chuàng)建:

ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("demo-pool-%d").build();

參數(shù)說明:

  • corePoolSize
    核心線程數(shù)恰聘,默認(rèn)情況下核心線程會一直存活,即使處于閑置狀態(tài)也不會受存keepAliveTime限制吸占。除非將allowCoreThreadTimeOut設(shè)置為true晴叨。
  • maximumPoolSize
    線程池所能容納的最大線程數(shù)。超過這個數(shù)的線程將被阻塞矾屯。當(dāng)任務(wù)隊列為沒有設(shè)置大小的LinkedBlockingDeque時兼蕊,這個值無效。
  • keepAliveTime
    非核心線程的閑置超時時間件蚕,超過這個時間就會被回收孙技。
  • workQueue
    線程池中的任務(wù)隊列。常用的有三種隊列排作,SynchronousQueue,LinkedBlockingDeque,ArrayBlockingQueue牵啦。
  • threadFactory
    線程工廠,提供創(chuàng)建新線程的功能妄痪。
  • RejectedExecutionHandler
    當(dāng)線程池中的資源已經(jīng)全部使用哈雏,添加新線程被拒絕時,會調(diào)用RejectedExecutionHandler的rejectedExecution方法衫生。

線程池規(guī)則:
1.如果線程數(shù)量<=核心線程數(shù)量裳瘪,那么直接啟動一個核心線程來執(zhí)行任務(wù),不會放入隊列中罪针。
2.如果線程數(shù)量>核心線程數(shù)彭羹,但<=最大線程數(shù),并且任務(wù)隊列是LinkedBlockingDeque的時候站故,超過核心線程數(shù)量的任務(wù)會放在任務(wù)隊列中排隊皆怕。
3.如果線程數(shù)量>核心線程數(shù),但<=最大線程數(shù)西篓,并且任務(wù)隊列是SynchronousQueue的時候愈腾,線程池會創(chuàng)建新線程執(zhí)行任務(wù),這些任務(wù)也不會被放在任務(wù)隊列中岂津。這些線程屬于非核心線程虱黄,在任務(wù)完成后,閑置時間達(dá)到了超時時間就會被清除吮成。
4.如果線程數(shù)量>核心線程數(shù)橱乱,并且>最大線程數(shù)辜梳,當(dāng)任務(wù)隊列是LinkedBlockingDeque,會將超過核心線程的任務(wù)放在任務(wù)隊列中排隊泳叠。也就是當(dāng)任務(wù)隊列是LinkedBlockingDeque并且沒有大小限制時作瞄,線程池的最大線程數(shù)設(shè)置是無效的,他的線程數(shù)最多不會超過核心線程數(shù)危纫。
5.如果線程數(shù)量>核心線程數(shù)宗挥,并且>最大線程數(shù),當(dāng)任務(wù)隊列是SynchronousQueue的時候种蝶,會因為線程池拒絕添加任務(wù)而拋出異常契耿。


image.png

使coreThread失效

之前設(shè)置的keepAliveTime參數(shù)只能使超過此閾值的非核心線程失效,使用allowCoreThreadTimeOut(boolean value)方法將allowCoreThreadTimeOut設(shè)置為true則可以將該策略應(yīng)用于核心線程螃征。

http://www.ideabuffer.cn/2017/04/04/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3Java%E7%BA%BF%E7%A8%8B%E6%B1%A0%EF%BC%9AThreadPoolExecutor/
https://blog.csdn.net/z_s_z2016/article/details/81674893

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末搪桂,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子盯滚,更是在濱河造成了極大的恐慌踢械,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,080評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件淌山,死亡現(xiàn)場離奇詭異裸燎,居然都是意外死亡顾瞻,警方通過查閱死者的電腦和手機泼疑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來荷荤,“玉大人退渗,你說我怎么就攤上這事≡棠桑” “怎么了会油?”我有些...
    開封第一講書人閱讀 157,630評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長古毛。 經(jīng)常有香客問我翻翩,道長,這世上最難降的妖魔是什么稻薇? 我笑而不...
    開封第一講書人閱讀 56,554評論 1 284
  • 正文 為了忘掉前任嫂冻,我火速辦了婚禮,結(jié)果婚禮上塞椎,老公的妹妹穿的比我還像新娘桨仿。我一直安慰自己,他們只是感情好案狠,可當(dāng)我...
    茶點故事閱讀 65,662評論 6 386
  • 文/花漫 我一把揭開白布服傍。 她就那樣靜靜地躺著钱雷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吹零。 梳的紋絲不亂的頭發(fā)上罩抗,一...
    開封第一講書人閱讀 49,856評論 1 290
  • 那天,我揣著相機與錄音灿椅,去河邊找鬼澄暮。 笑死,一個胖子當(dāng)著我的面吹牛阱扬,可吹牛的內(nèi)容都是我干的泣懊。 我是一名探鬼主播,決...
    沈念sama閱讀 39,014評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼麻惶,長吁一口氣:“原來是場噩夢啊……” “哼馍刮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起窃蹋,我...
    開封第一講書人閱讀 37,752評論 0 268
  • 序言:老撾萬榮一對情侶失蹤卡啰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后警没,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體匈辱,經(jīng)...
    沈念sama閱讀 44,212評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,541評論 2 327
  • 正文 我和宋清朗相戀三年杀迹,在試婚紗的時候發(fā)現(xiàn)自己被綠了亡脸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,687評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡树酪,死狀恐怖浅碾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情续语,我是刑警寧澤垂谢,帶...
    沈念sama閱讀 34,347評論 4 331
  • 正文 年R本政府宣布,位于F島的核電站疮茄,受9級特大地震影響滥朱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜力试,卻給世界環(huán)境...
    茶點故事閱讀 39,973評論 3 315
  • 文/蒙蒙 一徙邻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧懂版,春花似錦鹃栽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽薇芝。三九已至,卻和暖如春丰嘉,著一層夾襖步出監(jiān)牢的瞬間夯到,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評論 1 266
  • 我被黑心中介騙來泰國打工饮亏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留耍贾,地道東北人。 一個月前我還...
    沈念sama閱讀 46,406評論 2 360
  • 正文 我出身青樓路幸,卻偏偏與公主長得像荐开,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子简肴,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,576評論 2 349

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