Tomcat執行緒池原理
阿新 • • 發佈:2022-03-27
Tomcat 兩大元件
聯結器Connector 負責對外溝通 使用到了執行緒池
容器Container 負責實現Servlet規範
聯結器 期中一部分元件NIO EndPoint的組成
- LimitLatch 用來限流,可以控制最大連線個數,類似 J.U.C 中的 Semaphore 後面再講
- Acceptor 只負責【接收新的 socket 連線】
- Poller 只負責監聽 socket channel是否有【可讀的 I/O 事件】
- 一旦可讀,封裝一個任務物件(socketProcessor),提交給 Executor 執行緒池處理
- Executor 執行緒池中的工作執行緒最終負責【處理請求】
Tomcat 執行緒池擴充套件了 ThreadPoolExecutor,行為稍有不同
- 如果匯流排程數達到 maximumPoolSize
- 這時不會立刻拋 RejectedExecutionException 異常
- 而是再次嘗試將任務放入佇列,如果還失敗,才丟擲 RejectedExecutionException 異常
發生異常後 抓住異常 嘗試使用force 方法 加入阻塞佇列 還是失敗 丟擲異常 一定時間內重試 而且幾乎只有一次機會
Tomcat執行緒池配置
Connector 配置
Executor 執行緒配置
預設是守護新城
問題:無界阻塞佇列是否意味著永遠無法觸發救急執行緒?
Tomcat對 佇列的做了封裝 taskQueue 修改了實現
這個圖好像有點問題 總之是 核心執行緒不夠用了 先考慮建立救急執行緒 再考慮加入佇列