線程池-4

runWorker方法相對比較簡單盖溺,主要有個循環(huán)

try{

while (task != null || (task = getTask()) != null) {

??? …

try {

?????? ?…

??????? task.run();


???? } finally {

???? ? task = null;

???????? …

??? }

}

}finally {

?????? processWorkerExit(w,completedAbruptly);

}

可以看到task

!=null 即啟動線程時傳進來的第一個任務(wù),執(zhí)行完之后,runWorker并不會退出搔扁,而是線程復(fù)用繼續(xù)getTask()從隊列中獲取任務(wù),直至所有任務(wù)都執(zhí)行完敲才,getTask()返回空晦墙。

getTask()也比較簡單,主要代碼就是:

Runnable r = timed ?

workQueue.poll(keepAliveTime,

TimeUnit.NANOSECONDS) :

workQueue.take();

如果設(shè)置了超時就poll歧斟,否則就take()一直阻塞纯丸,直到從隊列中獲取到任務(wù)為止。一般情況静袖,如果線程池數(shù)大于core的時候觉鼻,需要回收(poll),線程數(shù)等于core時核心線程是不會被回收的勾徽,就一直阻塞等待任務(wù)加入隊列滑凉。


processWorkerExit(w, completedAbruptly); 這個方法,是在所有任務(wù)都已執(zhí)行完或發(fā)生異常時執(zhí)行喘帚,completedAbruptly=true 表示異常退出畅姊,false表示正常退出。

processWorkerExit方法相對來說也挺好理解:

1吹由、線程池完成任務(wù)數(shù)增加當前線程的完成任務(wù)數(shù)若未,workers集合移除當前worker

completedTaskCount += w.completedTasks;

workers.remove(w);

2、tryTerminate(); //嘗試結(jié)束線程池

3倾鲫、這時候線程池狀態(tài)還是小于STOP:

如果當前線程是異常退出粗合,則需要再啟動一個線程繼續(xù)去執(zhí)行任務(wù)隊列的任務(wù)萍嬉;

正常退出邏輯:min:線程池最小空閑數(shù),允許核心線程超時則為0隙疚,否則為核心線程池大小corePoolSize壤追,而如果min=0并且任務(wù)列表不為空,則min=1即至少要保證一個線程來處理隊列中的任務(wù)供屉。if

(workerCountOf(c) >= min) 即當前線程池中的工作線程大于最小空閑數(shù)行冰,就不用擔心了,直接返回伶丐。否則就跟異常退出一樣悼做,需要再啟動一個線程繼續(xù)執(zhí)行隊列中的任務(wù)』┗辏總結(jié)一下就是以下三種情況需要新增一個Worker來替代原來的:

// 1. 用戶執(zhí)行的任務(wù)發(fā)生了異常

// 2. Worker數(shù)量比線程池基本大小要小

// 3. 阻塞隊列不空但是沒有任何Worker在工作

if (runStateLessThan(c, STOP)) {

?????? if(!completedAbruptly) {

????????????? intmin = allowCoreThreadTimeOut ? 0 : corePoolSize;

????????????? if(min == 0 && ! workQueue.isEmpty())

???????????????????? min= 1;

????????????? if(workerCountOf(c) >= min)

???????????????????? return;// replacement not needed

?????? }

?????? addWorker(null,false);

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肛走,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子录别,更是在濱河造成了極大的恐慌朽色,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件庶灿,死亡現(xiàn)場離奇詭異纵搁,居然都是意外死亡,警方通過查閱死者的電腦和手機往踢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門腾誉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人峻呕,你說我怎么就攤上這事利职。” “怎么了瘦癌?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵猪贪,是天一觀的道長。 經(jīng)常有香客問我讯私,道長热押,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任斤寇,我火速辦了婚禮桶癣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘娘锁。我一直安慰自己牙寞,他們只是感情好,可當我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著间雀,像睡著了一般悔详。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上惹挟,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天茄螃,我揣著相機與錄音,去河邊找鬼匪煌。 笑死责蝠,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的萎庭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼齿拂,長吁一口氣:“原來是場噩夢啊……” “哼驳规!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起署海,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤吗购,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后砸狞,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捻勉,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年刀森,在試婚紗的時候發(fā)現(xiàn)自己被綠了踱启。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡研底,死狀恐怖埠偿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情榜晦,我是刑警寧澤冠蒋,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站乾胶,受9級特大地震影響抖剿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜识窿,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一斩郎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧腕扶,春花似錦孽拷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽膜宋。三九已至,卻和暖如春炼幔,著一層夾襖步出監(jiān)牢的瞬間秋茫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工乃秀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留肛著,地道東北人。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓跺讯,卻偏偏與公主長得像枢贿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子刀脏,可洞房花燭夜當晚...
    茶點故事閱讀 45,573評論 2 359

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