線程池

線程池能夠避免頻繁創(chuàng)建銷毀線程帶來的性能損耗玻佩,同時還維護(hù)了線程池的一些統(tǒng)計信息齿穗。

JDK中線程池的核心類是ThreadPoolExecutor,它的繼承鏈如下

ThreadPoolExecutor——>AbstractExecutorService——>ExecutorService——>Executor

Executor是一個只包含execute方法的接口,它的作用是將Task的提交和Task的執(zhí)行進(jìn)行解耦(Netty設(shè)計了自己的線程模型鞋喇,該接口在Netty中也大量使用)。

ExecutorService提供了Executor和Task(借助Futrue接口)的生命周期的管理函數(shù)眉撵。

下面侦香,主要看ThreadPoolExecutor這個類。

1.組成:

ThreadPoolExecutor包含一個BlockingQueue(workQueue)用于存儲任務(wù)纽疟,一個Set<Worker>(workers)用于存儲執(zhí)行任務(wù)的線程罐韩。

2.重要初始參數(shù):

(1)int?corePoolSize ?線程池核心線程數(shù)目

(2)int maximumPoolSize ?線程最大線程數(shù)目

默認(rèn)情況下,線程池初始化后污朽,是沒有線程的散吵,當(dāng)execute第一個任務(wù)時創(chuàng)建第一個Worker(即創(chuàng)建線程);當(dāng)線程數(shù)小于corePoolSize時蟆肆,不管有沒有空閑的線程矾睦,都會創(chuàng)建一個Worker并執(zhí)行該任務(wù);當(dāng)線程數(shù)大于等于corePoolSize時炎功,新來的任務(wù)會優(yōu)先加入到workQueue顷锰,當(dāng)workQueue滿的時候,才會新創(chuàng)建Work線程亡问,當(dāng)線程數(shù)目等于maximumPoolSize且workQueue滿的時候官紫,會采用RejectedExecutionHandler根據(jù)拒絕策略處理該任務(wù)。

(3)long keepAliveTime

大于corePoolSize的空閑線程的最大idle時間州藕,通過BlockingQueue的poll(long timeout, TimeUnit unit)實現(xiàn)束世。

(4)TimeUnit unit

(5)BlockingQueue workQueue

阻塞隊列,三種典型的選擇床玻,SynchronousQueue毁涉、LinkedBlockingQueue、ArrayBlockingQueue锈死。

SynchronousQueue:該隊列沒有容量只是在生產(chǎn)者消費者之間交換信息和任務(wù)贫堰,此情況下線程池maxsize通常無限制,但也要防止耗盡系統(tǒng)資源待牵。

LinkedBlockingQueue:無界的阻塞隊列其屏,maxsize失去作用,同樣可能會耗盡系統(tǒng)資源缨该。

ArrayBlockingQueue:queuesize和maxpoolsize要合理配置偎行,大的queuesize和小的maxpoolsize可以減少線程切換的損耗,但是可能會影響吞吐量,小的queuesize和大的maxpoolsize也可能會產(chǎn)生大量線程切換進(jìn)而影響吞吐量蛤袒。

(6)ThreadFactory threadFactory

為線程起名字熄云,利于日志分析。

(7)RejectedExecutionHandler

拒絕策略妙真,應(yīng)用了策略模式缴允,JDK實現(xiàn)了四種,1.拋出異常珍德,2.直接丟棄练般,3.刪除阻塞隊列中最老的task,4.添加任務(wù)的線程執(zhí)行該任務(wù)(進(jìn)而減慢生產(chǎn)者速度菱阵,達(dá)到調(diào)節(jié)作用)踢俄。

3.狀態(tài)

RUNNING: 接收新任務(wù)缩功,并處理阻塞隊列中的任務(wù)晴及;

SHUTDOWN: 不接收新任務(wù),但處理隊列中的任務(wù)嫡锌;

STOP: ? ?不接收新任務(wù)虑稼,不處理隊列中的任務(wù),并中斷所有正在執(zhí)行的任務(wù)势木;

TIDYING: ?所有任務(wù)都被蛛倦,worker數(shù)目為0,當(dāng)狀態(tài)變?yōu)門IDYING時啦桌,會執(zhí)行terminated()鉤子方法溯壶;

TERMINATED: terminated() 方法完成。

RUNNING -> SHUTDOWN: On invocation of shutdown(), perhaps implicitly in finalize()

(RUNNING or SHUTDOWN) -> STOP:On invocation of shutdownNow()

SHUTDOWN -> TIDYING:When both queue and pool are empty

STOP -> TIDYING:When pool is empty

TIDYING -> TERMINATED:When the terminated() hook method has completed

4.源碼分析

ThreadPoolExecutor的核心方法是execute方法甫男,其實現(xiàn)其實就是按照前面的執(zhí)行策略且改,建立線程(Worker),或者將任務(wù)添加到阻塞隊列板驳,或者將任務(wù)交給拒絕策略又跛。

添加Work的過程需要對mainLock加鎖(mainLock用于控制對Worker集合的訪問)。

Worker實現(xiàn)了Runnable接口若治,并繼承了AbstractQueuedSynchronizer類(實現(xiàn)了一個不可重入鎖慨蓝,作主要控制work線程的中斷,未啟動的線程不能中斷端幼,執(zhí)行shutdown方法時礼烈,先獲取該work的鎖才能中斷該線程),并且它是ThreadPoolExecutor的內(nèi)部類(這樣它就能訪問ThreadPoolExecutor的內(nèi)部變量和方法婆跑,在某種程度上可以說是實現(xiàn)了多繼承)济丘。它持有一個線程,一個Runnable即第一個執(zhí)行的任務(wù),以及一個long表示完成任務(wù)的數(shù)目摹迷。

Worker初始化的時候疟赊,state(AbstractQueuedSynchronizer的屬性)為-1,避免對為啟動的Work調(diào)用interrupt方法峡碉。

run方法執(zhí)行ThreadPoolExecutor的runWorker方法近哟,該方法首先獲得firstTask,并將其賦值為null使其得到回收鲫寄,接著在while循環(huán)中吉执,執(zhí)行第一個任務(wù),并不斷從阻塞隊列中獲取任務(wù)執(zhí)行地来,需要注意的是每次執(zhí)行任務(wù)前都要調(diào)用Work實例的加鎖方法戳玫,并檢查線程池的狀態(tài)(加鎖是防止shutdown時,殺死還在執(zhí)行任務(wù)的線程)未斑。


參考文章:

https://www.cnblogs.com/trust-freedom/p/6681948.html#label_3_3

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末咕宿,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蜡秽,更是在濱河造成了極大的恐慌府阀,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芽突,死亡現(xiàn)場離奇詭異试浙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)寞蚌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門田巴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人挟秤,你說我怎么就攤上這事壹哺。” “怎么了煞聪?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵斗躏,是天一觀的道長。 經(jīng)常有香客問我昔脯,道長啄糙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任云稚,我火速辦了婚禮隧饼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘静陈。我一直安慰自己燕雁,他們只是感情好诞丽,可當(dāng)我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拐格,像睡著了一般。 火紅的嫁衣襯著肌膚如雪捏浊。 梳的紋絲不亂的頭發(fā)上懂衩,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天,我揣著相機(jī)與錄音金踪,去河邊找鬼浊洞。 笑死,一個胖子當(dāng)著我的面吹牛胡岔,可吹牛的內(nèi)容都是我干的法希。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼靶瘸,長吁一口氣:“原來是場噩夢啊……” “哼苫亦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起奕锌,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤著觉,失蹤者是張志新(化名)和其女友劉穎村生,沒想到半個月后惊暴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡趁桃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年辽话,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卫病。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡油啤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蟀苛,到底是詐尸還是另有隱情益咬,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布帜平,位于F島的核電站幽告,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏裆甩。R本人自食惡果不足惜冗锁,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嗤栓。 院中可真熱鬧冻河,春花似錦箍邮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至擂错,卻和暖如春廷蓉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背马昙。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工桃犬, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人行楞。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓攒暇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親子房。 傳聞我的和親對象是個殘疾皇子形用,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,901評論 2 355

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