線程池

引言

合理利用線程池能夠帶來三個好處昌讲。第一:降低資源消耗国夜。通過重復利用已創(chuàng)建的線程降低線程創(chuàng)建和銷毀造成的消耗。第二:提高響應速度剧蚣。當任務到達時支竹,任務可以不需要的等到線程創(chuàng)建就能立即執(zhí)行。第三:提高線程的可管理性鸠按。線程是稀缺資源礼搁,如果無限制的創(chuàng)建,不僅會消耗系統(tǒng)資源目尖,還會降低系統(tǒng)的穩(wěn)定性馒吴,使用線程池可以進行統(tǒng)一的分配,調(diào)優(yōu)和監(jiān)控。但是要做到合理的利用線程池饮戳,必須對其原理了如指掌豪治。

線程池的使用

線程池的創(chuàng)建

創(chuàng)建一個線程池需要輸入幾個參數(shù):

corePoolSize(線程池的基本大小):當提交一個任務到線程池時扯罐,線程池會創(chuàng)建一個線程來執(zhí)行任務负拟,即使其他基本線程是空閑的,直到需要執(zhí)行的任務數(shù)大于線程池基本大小時就不再創(chuàng)建歹河。如果調(diào)用了線程池的prestartAllCoreThreads方法掩浙,線程池會提前啟動所有基本線程。

runnableTaskQueue(任務隊列):用于保存等待執(zhí)行的任務的阻塞隊列秸歧。

可以選擇以下幾個阻塞隊列厨姚。

ArrayBlockingQueue:是一個基于數(shù)組結(jié)構(gòu)的有界阻塞隊列,此隊列按 FIFO(先進先出)原則對元素進行排序键菱。

LinkedBlockingQueue:一個基于鏈表結(jié)構(gòu)的阻塞隊列谬墙,此隊列按FIFO (先進先出)排序元素,吞吐量通常要高于ArrayBlockingQueue经备。靜態(tài)工廠方法Executors.newFixedThreadPool()使用了這個隊列拭抬。

SynchronousQueue:一個不存儲元素的阻塞隊列。每個插入操作必須等到另一個線程調(diào)用移除操作弄喘,否則插入操作一直處于阻塞狀態(tài)玖喘,吞吐量通常要高于LinkedBlockingQueue,靜態(tài)工廠方法Executors.newCachedThreadPool使用了這個隊列蘑志。

PriorityBlockingQueue:一個具有優(yōu)先級得無限阻塞隊列累奈。

maximumPoolSize(線程池最大大小):線程池允許創(chuàng)建的最大線程數(shù)急但。如果隊列滿了澎媒,并且已創(chuàng)建的線程數(shù)小于最大線程數(shù),則線程池會再創(chuàng)建新的線程執(zhí)行任務波桩。值得注意的是如果使用了無界的任務隊列這個參數(shù)就沒什么效果戒努。

ThreadFactory:用于設置創(chuàng)建線程的工廠,可以通過線程工廠給每個創(chuàng)建出來的線程設置更有意義的名字镐躲。

RejectedExecutionHandler(飽和策略):當隊列和線程池都滿了储玫,說明線程池處于飽和狀態(tài),那么必須采取一種策略處理提交的新任務萤皂。這個策略默認情況下是AbortPolicy撒穷,表示無法處理新任務時拋出異常。以下是JDK1.5提供的四種策略裆熙。

AbortPolicy:直接拋出異常端礼。

CallerRunsPolicy:只用調(diào)用者所在線程來運行任務禽笑。

DiscardOldestPolicy:丟棄隊列里最近的一個任務,并執(zhí)行當前任務蛤奥。

DiscardPolicy:不處理佳镜,丟棄掉。

當然也可以根據(jù)應用場景需要來實現(xiàn)RejectedExecutionHandler接口自定義策略凡桥。如記錄日志或持久化不能處理的任務蟀伸。

keepAliveTime(線程活動保持時間):線程池的工作線程空閑后,保持存活的時間唬血。所以如果任務很多望蜡,并且每個任務執(zhí)行的時間比較短,可以調(diào)大這個時間拷恨,提高線程的利用率。

TimeUnit(線程活動保持時間的單位):可選的單位有天(DAYS)谢肾,小時(HOURS)腕侄,分鐘(MINUTES),毫秒(MILLISECONDS)芦疏,微秒(MICROSECONDS,千分之一毫秒)和毫微秒(NANOSECONDS,千分之一微秒)冕杠。



線程池的分析

1. 首先線程池判斷基本線程池是否已滿?沒滿酸茴,創(chuàng)建一個工作線程來執(zhí)行任務分预。滿了,則進入下個流程薪捍。

2.?其次線程池判斷工作隊列是否已滿笼痹?沒滿,則將任務存儲在工作隊列里酪穿。滿了凳干,則進入下個流程。

3.?最后線程池判斷整個線程池是否已滿被济?沒滿救赐,則創(chuàng)建一個新的工作線程來執(zhí)行任務,滿了只磷,則交給飽和策略來處理這個任務经磅。



合理的配置線程池

要想合理的配置線程池,就必須首先分析任務特性钮追,可以從以下幾個角度來進行分析:

1.?任務的性質(zhì):CPU密集型任務预厌,IO密集型任務和混合型任務。

2.?任務的優(yōu)先級:高畏陕,中和低配乓。

3.?任務的執(zhí)行時間:長,中和短。

4.?任務的依賴性:是否依賴其他系統(tǒng)資源犹芹,如數(shù)據(jù)庫連接崎页。

任務性質(zhì)不同的任務可以用不同規(guī)模的線程池分開處理。CPU密集型任務配置盡可能小的線程腰埂,如配置Ncpu 1個線程的線程池飒焦。IO密集型任務則由于線程并不是一直在執(zhí)行任務,則配置盡可能多的線程屿笼,如2*Ncpu牺荠。混合型的任務驴一,如果可以拆分休雌,則將其拆分成一個CPU密集型任務和一個IO密集型任務,只要這兩個任務執(zhí)行的時間相差不是太大肝断,那么分解后執(zhí)行的吞吐率要高于串行執(zhí)行的吞吐率杈曲,如果這兩個任務執(zhí)行時間相差太大,則沒必要進行分解胸懈。使用Runtime.getRuntime().availableProcessors()得到CPU的個數(shù)担扑。

優(yōu)先級不同的任務可以使用優(yōu)先級隊列PriorityBlockingQueue來處理。它可以讓優(yōu)先級高的任務先得到執(zhí)行趣钱,需要注意的是如果一直有優(yōu)先級高的任務提交到隊列里涌献,那么優(yōu)先級高的任務可能永遠不能執(zhí)行。

執(zhí)行時間不同的任務可以交給不同規(guī)模的線程池來處理首有,或者也可以使用優(yōu)先級隊列燕垃,讓執(zhí)行時間短的任務先執(zhí)行。

依賴數(shù)據(jù)庫連接池的任務绞灼,因為線程提交SQL后利术,需要等待數(shù)據(jù)庫返回結(jié)果,如果等待的時間越長低矮,CPU空閑時間就越長印叁,那么線程數(shù)應該設置越大,這樣才能更好的利用CPU军掂。

配置線程池有兩點建議:第一轮蜕,使用變量(如CPU的個數(shù),連接池的大小)來動態(tài)配置線程池大小蝗锥,這樣做可以增加線程池的可伸縮性跃洛,即當CPU增加時,線程池的處理能力相應增加终议。第二汇竭,使用有界隊列葱蝗。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市细燎,隨后出現(xiàn)的幾起案子两曼,更是在濱河造成了極大的恐慌,老刑警劉巖玻驻,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悼凑,死亡現(xiàn)場離奇詭異,居然都是意外死亡璧瞬,警方通過查閱死者的電腦和手機户辫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嗤锉,“玉大人渔欢,你說我怎么就攤上這事〉刀” “怎么了膘茎?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長酷誓。 經(jīng)常有香客問我,道長态坦,這世上最難降的妖魔是什么盐数? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮伞梯,結(jié)果婚禮上玫氢,老公的妹妹穿的比我還像新娘。我一直安慰自己谜诫,他們只是感情好漾峡,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著喻旷,像睡著了一般生逸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上且预,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天槽袄,我揣著相機與錄音,去河邊找鬼锋谐。 笑死遍尺,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的涮拗。 我是一名探鬼主播乾戏,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼迂苛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鼓择?” 一聲冷哼從身側(cè)響起三幻,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎惯退,沒想到半個月后赌髓,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡催跪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年锁蠕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片懊蒸。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡荣倾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出骑丸,到底是詐尸還是另有隱情舌仍,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布通危,位于F島的核電站铸豁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏菊碟。R本人自食惡果不足惜节芥,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望逆害。 院中可真熱鬧头镊,春花似錦、人聲如沸魄幕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纯陨。三九已至坛芽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間队丝,已是汗流浹背靡馁。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留机久,地道東北人臭墨。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像膘盖,于是被迫代替她去往敵國和親胧弛。 傳聞我的和親對象是個殘疾皇子尤误,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

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

  • 為什么使用線程池 當我們在使用線程時,如果每次需要一個線程時都去創(chuàng)建一個線程结缚,這樣實現(xiàn)起來很簡單损晤,但是會有一個問題...
    閩越布衣閱讀 4,292評論 10 45
  • 文章摘要:在業(yè)務系統(tǒng)中,線程池框架技術(shù)一直是用來解決多線程并發(fā)的一種有效方法红竭。 在JDK中尤勋,J.U.C并發(fā)包下的T...
    癲狂俠閱讀 2,091評論 2 21
  • 線程池的概念和定義 在服務器端的業(yè)務應用開發(fā)中,Web服務器(諸如Tomcat茵宪、Jetty)需要接受并處理http...
    dtdh閱讀 837評論 0 1
  • 今天手機摔了最冰,屏碎了一個角。打印機也壞了稀火。很郁悶暖哨。后來冷靜了一下。把辦公桌整理了一下凰狞,順便整理思路篇裁。把打印機修好了...
    快樂番茄閱讀 64評論 0 0
  • 第一篇文章,留給自己赡若。 曾經(jīng)無數(shù)次尋求一個可以傾訴的地方达布, 一個沒有你現(xiàn)實生活中的人的地方。 然后我來到了這里 逾冬。...
    五四青年汪閱讀 156評論 0 1