每一個任務(wù):Runnable只有兩種處理方式
1、創(chuàng)建Worker執(zhí)行血筑;
2绘沉、進入阻塞隊列。
每一個Worker中獲取Runnable的方式只有兩種方式
1豺总、第一個進來的Runnable對象车伞,也就是創(chuàng)建Worker的那個,會被Worker執(zhí)行园欣;
2帖世、從阻塞隊列中take取出Runnable對象。
注意??:Worker并不會在等待過程中處理非第一個Runnable對象沸枯,也就是說舊Worker不會執(zhí)行新進來的Runnable對象,除非他來自阻塞隊列赂弓。
跟核心線程數(shù)的比對绑榴、最大線程數(shù)、阻塞隊列的比對盈魁,處理情景
當(dāng)核心線程數(shù)為4翔怎、最大線程數(shù)為10、阻塞隊列最大長度為20
此時如果有Runnable【線程任務(wù)】進來杨耙,則會判斷workerCount【W(wǎng)orker的數(shù)量】赤套、maxThreadCount【最大線程數(shù)】和阻塞隊列大小。進行具體分析在做操作珊膜。
- 如果workerCount < coreThreadCount【核心線程數(shù)】容握,則創(chuàng)建新的Worker執(zhí)行Runnable對象;
- 如果workerCount = coreThreadCount车柠,則新進來的Runnable對象進入阻塞隊列中剔氏,等待其他的Worker中的Runnable對象執(zhí)行完畢塑猖,再被其他Worker采用阻塞隊列的take方法獲取到并執(zhí)行;
- 如果workerCount < maxThreadCount并且BlockingQueue【阻塞隊列滿了】谈跛,此時新進來的Runnable對象將重新創(chuàng)建Worker執(zhí)行Runnable羊苟。(也就是說,此時新進來的比之前進來的Runnable可能早執(zhí)行感憾,因為之前的處在阻塞隊列中被阻塞蜡励,還在等待狀態(tài))。
- 如果workerCount = maxThreadCount并且BlockingQueue【阻塞隊列滿了】阻桅,則通過拒絕策略拒絕任務(wù)凉倚。我干不動了!
經(jīng)典提問
1鳍刷、如果此時上述條件成立占遥,一共有8個任務(wù),怎么為其分配線程输瓜?
答案:分配核心線程數(shù)4個瓦胎,其他后續(xù)任務(wù)進入阻塞隊列。
2尤揣、線程池中先來到的任務(wù)搔啊,一定比后來到的任務(wù)執(zhí)行完早嘛?
答案:不一定北戏,如果workerCount < coreThreadCount负芋,則早來早執(zhí)行;如果workerCount = coreThreadCount并且阻塞隊列未滿嗜愈,則早來早執(zhí)行旧蛾,如果此時阻塞隊列滿了,則后來的任務(wù)會先執(zhí)行蠕嫁。