成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

Tomcat修正JDK原生線程池bug的實現原理

瀏覽:435日期:2023-03-19 16:51:46

為提高處理能力和并發度,Web容器一般會把處理請求的任務放到線程池,而JDK的原生線程池先天適合CPU密集型任務,于是Tomcat改造之。

Tomcat 線程池原理

其實ThreadPoolExecutor的參數主要有如下關鍵點:

限制線程個數

限制隊列長度

而Tomcat對這倆資源都需要限制,否則高并發下CPU、內存都有被耗盡可能。
因此Tomcat的線程池傳參:

// 定制的任務隊列taskqueue = new TaskQueue(maxQueueSize);// 定制的線程工廠TaskThreadFactory tf = new TaskThreadFactory(namePrefix,							 daemon,							 getThreadPriority());// 定制線程池executor = new ThreadPoolExecutor(getMinSpareThreads(),								  getMaxThreads(),				 			      maxIdleTime, 				 			      TimeUnit.MILLISECONDS,				 			      taskqueue,				 			      tf);

Tomcat對線程數也有限制,設置:

  • 核心線程數(minSpareThreads)
  • 最大線程池數(maxThreads)

Tomcat線程池還有自己的特色任務處理流程,通過重寫execute方法實現了自己的特色任務處理邏輯:

  1. 前corePoolSize個任務時,來一個任務就創建一個新線程
  2. 再有任務,就把任務放入任務隊列,讓所有線程去搶。若隊列滿,就創建臨時線程
  3. 總線程數達到maximumPoolSize,則繼續嘗試把任務放入任務隊列
  4. 若緩沖隊列也滿了,插入失敗,執行拒絕策略

和 JDK 線程池的區別就在step3,Tomcat在線程總數達到最大數時,不是立即執行拒絕策略,而是再嘗試向任務隊列添加任務,添加失敗后再執行拒絕策略。

具體又是如何實現的呢?

public void execute(Runnable command, long timeout, TimeUnit unit) {    submittedCount.incrementAndGet();    try {// 調用JDK原生線程池的execute執行任務super.execute(command);    } catch (RejectedExecutionException rx) {       // 總線程數達到maximumPoolSize后,JDK原生線程池會執行默認拒絕策略if (super.getQueue() instanceof TaskQueue) {    final TaskQueue queue = (TaskQueue)super.getQueue();    try {// 繼續嘗試把任務放入任務隊列if (!queue.force(command, timeout, unit)) {    submittedCount.decrementAndGet();    // 若緩沖隊列還是滿了,插入失敗,執行拒絕策略。    throw new RejectedExecutionException("...");}    } }    }}

定制任務隊列

Tomcat線程池的execute方法第一行:

submittedCount.incrementAndGet();

任務執行失敗,拋異常時,將該計數器減一:

submittedCount.decrementAndGet();

Tomcat線程池使用 submittedCount 變量維護已提交到線程池,但未執行完的任務數量。

為何要維護這樣一個變量呢?

Tomcat的任務隊列TaskQueue擴展了JDK的LinkedBlockingQueue,Tomcat給了它一個capacity,傳給父類LinkedBlockingQueue的構造器。

public class TaskQueue extends LinkedBlockingQueue<Runnable> {  public TaskQueue(int capacity) {      super(capacity);  }  ...}

capacity參數通過Tomcat的maxQueueSize參數設置,但maxQueueSize默認值Integer.MAX_VALUE:當前線程數達到核心線程數后,再來任務的話線程池會把任務添加到任務隊列,并且總會成功,就永遠無機會創建新線程了。

為解決該問題,TaskQueue重寫了LinkedBlockingQueue#offer,在合適時機返回false,表示任務添加失敗,這時線程池就會創建新線程。

什么叫合適時機?

public class TaskQueue extends LinkedBlockingQueue<Runnable> {  ...   @Override  // 線程池調用任務隊列的方法時,當前線程數 > core線程數  public boolean offer(Runnable o) {      // 若線程數已達max,則不能創建新線程,只能放入任務隊列      if (parent.getPoolSize() == parent.getMaximumPoolSize())   return super.offer(o);        // 至此,表明 max線程數 > 當前線程數 > core線程數      // 說明可創建新線程:            // 1. 若已提交任務數 < 當前線程數      //    表明還有空閑線程,無需創建新線程      if (parent.getSubmittedCount()<=(parent.getPoolSize()))   return super.offer(o);        // 2. 若已提交任務數 > 當前線程數      //    線程不夠用了,返回false去創建新線程      if (parent.getPoolSize()<parent.getMaximumPoolSize())   return false;        // 默認情況下總是把任務放入任務隊列      return super.offer(o);  }  }

所以Tomcat維護 已提交任務數 是為了在任務隊列長度無限時,讓線程池還能有機會創建新線程。

到此這篇關于Tomcat是如何修正JDK原生線程池bug的的文章就介紹到這了,更多相關Tomcat JDK原生線程池內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!

標簽: Tomcat
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
亚洲日本在线观看| 中文字幕一区二区三中文字幕| 日韩午夜高潮| 在线精品亚洲一区二区| 91麻豆免费看片| 91亚洲男人天堂| 91麻豆国产精品久久| 成人av网站在线观看| 高清国产一区二区| 懂色av一区二区三区免费观看| 久久99热狠狠色一区二区| 麻豆国产91在线播放| 毛片一区二区三区| 精久久久久久久久久久| 激情综合五月婷婷| 国产黄人亚洲片| 成人av免费观看| 欧美视频四区| 亚洲精品一二三四区| 日韩美女久久久| 亚洲综合图片区| 麻豆一区二区三| 日韩电影在线免费看| 狠狠色狠狠色合久久伊人| 国产河南妇女毛片精品久久久| 国产精品夜夜嗨| 牛牛国产精品| 国产欧美日韩综合一区在线观看 | 在线这里只有精品| 久久激情久久| 欧美一区二区视频网站| 久久综合精品国产一区二区三区| 国产亚洲污的网站| 亚洲人成伊人成综合网小说| 午夜精品福利久久久| 国产麻豆一精品一av一免费| 99久久亚洲一区二区三区青草 | 欧美性生活影院| 久久伊99综合婷婷久久伊| 日韩美女视频19| 美国十次综合导航| 欧美大香线蕉线伊人久久国产精品| 国产精品va| 欧美在线观看一区| 久久精品夜色噜噜亚洲a∨| 亚洲一区二区综合| 国产盗摄精品一区二区三区在线 | 欧美日韩免费一区二区三区 | 成人国产免费视频| 在线一区欧美| 欧美一区二区黄色| 亚洲日韩欧美一区二区在线| 日韩高清在线观看| 欧美区亚洲区| 欧美色图一区二区三区| 国产精品久久久久久久久久久免费看 | 亚洲免费一区二区| 欧美高清你懂得| 久久久久久一级片| 亚洲福利视频三区| 亚洲午夜电影在线| 国产福利一区在线| 99精品国产视频| 99热免费精品| 美女精品国产| 亚洲精品一区在线观看| 一区二区高清视频在线观看| 黄色小说综合网站| 伊人成人在线| 91精品欧美久久久久久动漫| 日本一区二区三区久久久久久久久不 | 99re热这里只有精品免费视频 | 在线观看欧美亚洲| 欧美日韩精品系列| 亚洲理论在线观看| 国产精品1区二区.| 国产亚洲精品v| 欧美日韩一区 二区 三区 久久精品| 欧美电视剧在线观看完整版| 亚洲免费观看高清在线观看| 国产盗摄一区二区三区| 99精品欧美一区二区三区| 88在线观看91蜜桃国自产| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 蜜臀va亚洲va欧美va天堂 | 欧美精品首页| 国产亚洲午夜| 国产精品久久网站| 国产精品18久久久久久久网站| 亚洲黄色av| 欧美日韩一区二区在线观看视频| 亚洲色图色小说| 成人av第一页| 在线观看日韩电影| 亚洲精品成人少妇| 欧美激情国产日韩| 亚洲综合色网站| 成人综合婷婷国产精品久久蜜臀 | 99精品视频免费观看视频| 欧美mv和日韩mv国产网站| 美女看a上一区| 国产三级精品在线不卡| 国产欧美日韩三级| 成人高清视频免费观看| 欧美性感一区二区三区| 亚洲综合色自拍一区| 欧美大片专区| 久久综合久久综合亚洲| 国产成人8x视频一区二区| 91国产免费观看| 丝袜美腿亚洲一区| 国产精品久久波多野结衣| 国产精品久久国产精麻豆99网站 | 在线视频成人| 自拍视频在线观看一区二区| 91亚洲国产成人精品一区二区三 | 美女尤物国产一区| 91福利在线导航| 日韩 欧美一区二区三区| 亚洲欧美日韩精品久久久| 国产精品久久久久久亚洲毛片 | 成人av在线资源| 日韩三区在线观看| 国产成人h网站| 日韩一区二区视频| 国产不卡在线视频| 精品少妇一区二区| 波多野结衣中文一区| 欧美日韩国产综合久久| 亚洲国产精品一区二区久久| 国产精品免费一区二区三区在线观看 | 欧美三级一区二区| 国产精品自拍一区| 2024国产精品| 国产成人av电影免费在线观看| 色8久久精品久久久久久蜜| 水蜜桃久久夜色精品一区的特点| 久久国产一区二区| 麻豆国产91在线播放| 日韩一区和二区| 不卡大黄网站免费看| 亚洲日本激情| 亚洲不卡一区二区三区| 久久婷婷久久| 国产高清一区日本| 久久午夜国产精品| 亚洲看片网站| 日韩高清一区二区| 欧美一区二视频| 欧美片网站免费| 亚洲午夜久久久久久久久电影网| 欧亚一区二区三区| 粉嫩av一区二区三区| 中文字幕欧美日韩一区| 国产精品裸体一区二区三区| 久久精品国产久精国产| 亚洲国产精品综合小说图片区| 另类亚洲自拍| 国内久久精品视频| 国产偷国产偷亚洲高清人白洁| 不卡的电影网站| 一区二区三区在线播放| 在线成人午夜影院| 亚洲二区三区四区| 国产中文一区二区三区| 国产精品久久久久一区| 精品视频一区 二区 三区| 99久久伊人精品| 午夜久久久久久久久| 欧美专区日韩专区| 最新国产乱人伦偷精品免费网站| 美女精品一区二区| 国产欧美精品在线观看| 在线看国产日韩| 红桃视频国产精品| 精品夜夜嗨av一区二区三区| 一区av在线播放| 日韩欧美国产三级| 久久精品欧美| 午夜日韩av| 国内外成人在线| 国产精品久久久久久亚洲伦| 91.com视频| 久久久久久久久久久一区| 99麻豆久久久国产精品免费 | 日韩精品最新网址| 亚洲女优在线| 91亚洲精品久久久蜜桃| 老司机精品视频导航| 中文在线一区二区| 欧美日韩不卡视频| 午夜亚洲性色视频| 亚洲午夜久久久久久尤物| 国产成人免费在线视频| 亚洲国产精品综合小说图片区| 国产欧美一区二区精品性| 欧美日韩免费高清一区色橹橹| 国产亚洲精品bv在线观看| a在线播放不卡| 国产一区二区精品在线观看|