多線程

實(shí)現(xiàn)方式

1. 繼承Thread類
2. 實(shí)現(xiàn)Runnable接口

兩種方法的區(qū)別:Thread其實(shí)也是實(shí)現(xiàn)了Runable接口吼蚁,底層由JVM通過(guò)Native Code啟動(dòng)線程茬祷。主要的區(qū)別:

1.? Java的類可以實(shí)現(xiàn)多個(gè)接口,不能多繼承财破。所以Runable比Thread靈活笛厦。
2.? 同樣的業(yè)務(wù)邏輯可以封裝在Runnable的run方法里铆铆,然后用多線程去執(zhí)行,或者提交線程池執(zhí)行傀顾,但是注意多線程帶來(lái)的數(shù)據(jù)不一致的問(wèn)題襟铭。

線程池

ThreadPoolExecutor根據(jù)corePoolSize和maxPoolSize兩個(gè)參設(shè)置線程池的大小。當(dāng)新任務(wù)調(diào)用execute()方法提交任務(wù)時(shí)短曾,如果正在運(yùn)行線程數(shù)小于corePoolSize, 則創(chuàng)建新的線程處理請(qǐng)求寒砖,如果正在運(yùn)行的線程數(shù)等于corePoolSize, 新任務(wù)會(huì)添加到隊(duì)列中,直到隊(duì)列滿嫉拐,會(huì)開(kāi)辟新的線程來(lái)處理任務(wù)哩都,但是不超過(guò)最大線程設(shè)置maxPoolSize。當(dāng)任務(wù)隊(duì)列滿婉徘,并且線程數(shù)等于maxPoolSize的時(shí)候漠嵌,就會(huì)根據(jù)拒絕策略拒絕請(qǐng)求咐汞。

如果線程空閑超過(guò)keepAliveTime, 非核心線程就會(huì)被收回,若allowCoreThreadTimeOut為true儒鹿,則核心線程也會(huì)被收回化撕。默認(rèn)情況核心線程不會(huì)被收回。

Executors.FixedThreadPool 默認(rèn)corePoolSize = maxPoolSize,?keepAliveTime=0L约炎, 隊(duì)列采用LinkedBlockingQueue植阴。其實(shí)根據(jù)隊(duì)列的不同類型,還可以實(shí)現(xiàn)優(yōu)先級(jí)等高級(jí)功能

1. AbortPolicy
拒絕策略:拋出運(yùn)行時(shí)異常RejectedExecutionException
這種策略丟棄任務(wù)圾浅,并拋出異常

2. DiscardPolicy
拒絕策略:不能執(zhí)行的任務(wù)將被丟棄掠手。這種策略什么都沒(méi)做

3. DiscardOldestPolicy
拒絕策略:如果執(zhí)行程序尚未關(guān)閉,則位于工作隊(duì)列頭部的任務(wù)將被刪除贱傀,然后重試執(zhí)行程序。
該策略稍微復(fù)雜一些伊脓,在pool沒(méi)有關(guān)閉的前提下首先丟掉緩存在隊(duì)列中的最早的任務(wù)府寒,然后重新嘗試運(yùn)行該任務(wù)

4. CallerRunsPolicy
拒絕策略:線程調(diào)用運(yùn)行該任務(wù)的 execute 本身。此策略提供簡(jiǎn)單的反饋控制機(jī)制报腔,能夠減緩新任務(wù)的提交速度
該策略不想放棄執(zhí)行任務(wù)株搔。但是由于池中已經(jīng)沒(méi)有任何資源了,那么就直接使用調(diào)用該execute的線程本身來(lái)執(zhí)行纯蛾。

如何確定線程池的大小

根據(jù)服務(wù)的類型纤房,比如CPU, IO,或者混合類型來(lái)設(shè)置線程池的大小翻诉。

1. 如果是CPU密集型應(yīng)用炮姨,則線程池大小設(shè)置為N+1
2. 如果是IO密集型應(yīng)用,則線程池大小設(shè)置為2N+1

如果一臺(tái)服務(wù)器上只部署這一個(gè)應(yīng)用并且只有這一個(gè)線程池碰煌,那么這種估算或許合理
最佳線程數(shù)目 = ((線程等待時(shí)間+線程CPU時(shí)間)/線程CPU時(shí)間 )* CPU數(shù)目

比如平均每個(gè)線程CPU運(yùn)行時(shí)間為0.5s舒岸,而線程等待時(shí)間(非CPU運(yùn)行時(shí)間,比如IO)為1.5s芦圾,CPU核心數(shù)為8蛾派,那么根據(jù)上面這個(gè)公式估算得到:((0.5+1.5)/0.5)*8=32。這個(gè)公式進(jìn)一步轉(zhuǎn)化為:

最佳線程數(shù)目 = (線程等待時(shí)間與線程CPU時(shí)間之比 + 1)* CPU數(shù)目

可以得出一個(gè)結(jié)論:線程等待時(shí)間所占比例越高个少,需要越多線程洪乍。線程CPU時(shí)間所占比例越高,需要越少線程夜焦。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末壳澳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子茫经,更是在濱河造成了極大的恐慌钾埂,老刑警劉巖河闰,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異褥紫,居然都是意外死亡姜性,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門髓考,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)部念,“玉大人,你說(shuō)我怎么就攤上這事氨菇±芰叮” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵查蓉,是天一觀的道長(zhǎng)乌询。 經(jīng)常有香客問(wèn)我,道長(zhǎng)豌研,這世上最難降的妖魔是什么妹田? 我笑而不...
    開(kāi)封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮鹃共,結(jié)果婚禮上鬼佣,老公的妹妹穿的比我還像新娘。我一直安慰自己霜浴,他們只是感情好晶衷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著阴孟,像睡著了一般晌纫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上永丝,一...
    開(kāi)封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天缸匪,我揣著相機(jī)與錄音,去河邊找鬼类溢。 笑死凌蔬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的闯冷。 我是一名探鬼主播砂心,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蛇耀!你這毒婦竟也來(lái)了辩诞?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤纺涤,失蹤者是張志新(化名)和其女友劉穎译暂,沒(méi)想到半個(gè)月后抠忘,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡外永,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年崎脉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伯顶。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡囚灼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出祭衩,到底是詐尸還是另有隱情灶体,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布掐暮,位于F島的核電站蝎抽,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏路克。R本人自食惡果不足惜樟结,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望衷戈。 院中可真熱鬧狭吼,春花似錦层坠、人聲如沸殖妇。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)谦趣。三九已至,卻和暖如春座每,著一層夾襖步出監(jiān)牢的瞬間前鹅,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工峭梳, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舰绘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓葱椭,卻偏偏與公主長(zhǎng)得像捂寿,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子孵运,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

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

  • 為什么使用線程池 當(dāng)我們?cè)谑褂镁€程時(shí)秦陋,如果每次需要一個(gè)線程時(shí)都去創(chuàng)建一個(gè)線程,這樣實(shí)現(xiàn)起來(lái)很簡(jiǎn)單治笨,但是會(huì)有一個(gè)問(wèn)題...
    閩越布衣閱讀 4,291評(píng)論 10 45
  • 第一部分 來(lái)看一下線程池的框架圖,如下: 1顺又、Executor任務(wù)提交接口與Executors工具類 Execut...
    壓抑的內(nèi)心閱讀 4,261評(píng)論 1 24
  • Java-Review-Note——4.多線程 標(biāo)簽: JavaStudy PS:本來(lái)是分開(kāi)三篇的更卒,后來(lái)想想還是整...
    coder_pig閱讀 1,648評(píng)論 2 17
  • 隨著社會(huì)的發(fā)展,物質(zhì)條件和精神條件變得越來(lái)越豐富待榔,我們選擇的范圍越來(lái)越大逞壁,所做的選擇也越來(lái)越多。但面對(duì)紛繁復(fù)雜的選...
    雪兆峰年閱讀 1,013評(píng)論 0 2
  • 我總是很容易丟東西锐锣,健忘癥到了無(wú)法治愈的地步腌闯。 前不久 ,我把用了好幾年的內(nèi)存卡給弄丟了雕憔,里面有好多文件姿骏,照片...
    哼著C調(diào)的短發(fā)夏天閱讀 179評(píng)論 0 1