Java 線程池

線程的實現(xiàn)
  1. Thread
  2. Runnable
  3. Callable
什么時候使用線程池闪金?
  1. 單任務(wù)處理時間比較短
  2. 需要處理的任務(wù)量大
線程池的優(yōu)勢
  1. 重用存在的線程,減少線程創(chuàng)建瞳腌、銷毀的開銷绞铃,提高性能
  2. 提高響應速度,任務(wù)可以使用線程池中空閑的線程嫂侍,多任務(wù)同時執(zhí)行
  3. 提高線程的可管理性儿捧,對線程進行統(tǒng)一分配荚坞,監(jiān)控和調(diào)優(yōu)
線程池的狀態(tài)
  1. RUNNING 能夠接收任務(wù),對已添加的任務(wù)進行處理
  2. SHUTDOWN 不接收任務(wù)菲盾,但還能處理已添加的任務(wù)
  3. STOP 不接收任務(wù)颓影,不處理已添加的任務(wù),而且中斷正在執(zhí)行的任務(wù)
  4. TIDYING 當所有任務(wù)都終止懒鉴,如果想在 TIDYING 狀態(tài)時執(zhí)行某些東西诡挂,可以重寫 terminated() 函數(shù)
  5. TERMINATED 線程池終止
image.png
線程池的具體實現(xiàn)
  1. ThreaPoolExecutor 默認線程池
  2. ScheduledThreadPoolExecutor 定時線程池
public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler) 
                          
image.png
參數(shù)解析
  1. corePoolSize
    線程池中的核心線程數(shù),當提交一個任務(wù)時临谱,線程池創(chuàng)建一個新線程執(zhí)行任務(wù)璃俗,直到當前線程數(shù)等于 corePoolSize;如果當前線程數(shù)為 corePoolSize悉默,繼續(xù)提交的任務(wù)被保存到阻塞隊列中城豁,等待被執(zhí)行;如果執(zhí)行了線程池的 prestartAllCoreThreads() 方法抄课,線程池會提前創(chuàng)建并啟動所有核心線程唱星。

  2. maximumPoolSize
    線程池中允許的最大線程數(shù)。如果當前阻塞隊列滿了跟磨,且繼續(xù)提交任務(wù)间聊,則創(chuàng)建新的線程執(zhí)行任務(wù),前提是當前線程數(shù)小于maximumPoolSize

  3. keepAliveTime
    線程池維護線程所允許的空閑時間吱晒。當線程池中的線程數(shù)量大于 corePoolSize 的時候甸饱,如果這時沒有新的任務(wù)提交,核心線程外的線程不會立即銷毀仑濒,而是會等待,直到等待的時間超過了keepAliveTime偷遗;

  4. unit
    keepAliveTime的單位

  5. workQueue
    用來保存等待被執(zhí)行的任務(wù)的阻塞隊列墩瞳,且任務(wù)必須實現(xiàn)Runable接口,在JDK中提供了如下阻塞隊列:
    (a)氏豌、ArrayBlockingQueue:基于數(shù)組結(jié)構(gòu)的有界阻塞隊列喉酌,按FIFO排序任務(wù);

    (b)泵喘、LinkedBlockingQuene:基于鏈表結(jié)構(gòu)的阻塞隊列泪电,按FIFO排序任務(wù),吞吐量通常要高于ArrayBlockingQuene纪铺;

    (c)相速、SynchronousQuene:一個不存儲元素的阻塞隊列,每個插入操作必須等到另一個線程調(diào)用移除操作鲜锚,否則插入操作一直處于阻塞狀態(tài)突诬,吞吐量通常要高于LinkedBlockingQuene苫拍;

    (d)、priorityBlockingQuene:具有優(yōu)先級的無界阻塞隊列旺隙;

  6. threadFactory
    它是ThreadFactory類型的變量绒极,用來創(chuàng)建新線程。默認使用Executors.defaultThreadFactory() 來創(chuàng)建線程蔬捷。使用默認的 ThreadFactory 來創(chuàng)建線程時垄提,會使新創(chuàng)建的線程具有相同的 NORM_PRIORITY 優(yōu)先級并且是非守護線程,同時也設(shè)置了線程的名稱周拐。

  7. handler
    線程池的飽和策略塔淤,當阻塞隊列滿了,且沒有空閑的工作線程速妖,如果繼續(xù)提交任務(wù)高蜂,必須采取一種策略處理該任務(wù),線程池提供了4種策略:
    (a)罕容、AbortPolicy:直接拋出異常备恤,默認策略;

    (b)锦秒、CallerRunsPolicy:用調(diào)用者所在的線程來執(zhí)行任務(wù)露泊;

    (c)、DiscardOldestPolicy:丟棄阻塞隊列中靠最前的任務(wù)旅择,并執(zhí)行當前任務(wù)惭笑;

    (d)、DiscardPolicy:直接丟棄任務(wù)生真;

    上面的4種策略都是 ThreadPoolExecutor 的內(nèi)部類沉噩。

    當然也可以根據(jù)應用場景實現(xiàn) RejectedExecutionHandler 接口,自定義飽和策略柱蟀,如記錄日志或持久化存儲不能處理的任務(wù)川蒙。

線程池監(jiān)控
public long getTaskCount() //線程池已執(zhí)行與未執(zhí)行的任務(wù)總數(shù)
public long getCompletedTaskCount() //已完成的任務(wù)數(shù)
public int getPoolSize() //線程池當前的線程數(shù)
public int getActiveCount() //線程池中正在執(zhí)行任務(wù)的線程數(shù)量
參考

Java線程池原理與源碼詳細解讀

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市长已,隨后出現(xiàn)的幾起案子畜眨,更是在濱河造成了極大的恐慌,老刑警劉巖术瓮,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件康聂,死亡現(xiàn)場離奇詭異,居然都是意外死亡胞四,警方通過查閱死者的電腦和手機恬汁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來撬讽,“玉大人蕊连,你說我怎么就攤上這事悬垃。” “怎么了甘苍?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵尝蠕,是天一觀的道長。 經(jīng)常有香客問我载庭,道長看彼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任囚聚,我火速辦了婚禮靖榕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘顽铸。我一直安慰自己茁计,他們只是感情好,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布谓松。 她就那樣靜靜地躺著星压,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鬼譬。 梳的紋絲不亂的頭發(fā)上娜膘,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音优质,去河邊找鬼竣贪。 笑死,一個胖子當著我的面吹牛巩螃,可吹牛的內(nèi)容都是我干的演怎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼牺六,長吁一口氣:“原來是場噩夢啊……” “哼颤枪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起淑际,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎扇住,沒想到半個月后春缕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡艘蹋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年锄贼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片女阀。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡宅荤,死狀恐怖屑迂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情冯键,我是刑警寧澤惹盼,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站惫确,受9級特大地震影響手报,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜改化,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一掩蛤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧陈肛,春花似錦揍鸟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至前翎,卻和暖如春稚配,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背港华。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工道川, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人立宜。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓冒萄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親橙数。 傳聞我的和親對象是個殘疾皇子尊流,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354