java線程池
如果當前運行的線程,少於corePoolSize,則創建一個新的線程來執行任務。
如果運行的線程等於或多於 corePoolSize,將任務加入 BlockingQueue。
如果 BlockingQueue 內的任務超過上限,則創建新的線程來處理任務。
如果創建的線程超出 maximumPoolSize,任務將被拒絕策略拒絕。
tomcat線程池
如果當前運行的線程,少於corePoolSize,則創建一個新的線程來執行任務。
如果線程數大於 corePoolSize了,Tomcat 的線程不會直接把線程加入到無界的阻塞隊列中,而是去判斷submittedCount(已經提交線程數)是否等於 maximumPoolSize。
如果等於,表示線程池已經滿負荷運行,不能再創建線程了,直接把線程提交到隊列,
如果不等於,則需要判斷,是否有空閑線程可以消費。
如果有空閑線程則加入到阻塞隊列中,等待空閑線程消費。
如果沒有空閑線程,嘗試創建新的線程。(這一步保證了使用無界隊列,仍然可以利用線程的 maximumPoolSize)。
如果總線程數達到 maximumPoolSize,則繼續嘗試把線程加入 BlockingQueue 中。
如果 BlockingQueue 達到上限(假如設置了上限),被默認線程池啟動拒絕策略,tomcat 線程池會 catch 住拒絕策略拋出的異常,再次把嘗試任務加入中 BlockingQueue 中。
再次加入失敗,啟動拒絕策略。
一款用來看源碼的工具: https://github.com/CoatiSoftware/Sourcetrail/releases