日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

瀏覽:481日期: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
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
精品国产黄a∨片高清在线| 日韩av中文字幕一区二区三区| 国产精品夜夜夜| 欧美在线看片| 国产精品一级在线观看| 国产日产一区| 麻豆视频一区| 精品一区二区三区免费看| 国产亚洲精aa在线看| 国产精品1luya在线播放| 国产精品久久久一区二区| 国产精品网址| 成人影视亚洲图片在线| 深夜视频一区二区| 午夜电影亚洲| 亚洲精品看片| 欧美黄色精品| 日韩成人综合| 久久午夜影视| 国产精品黄网站| 亚洲午夜天堂| 尹人成人综合网| 日韩一区二区三区四区五区| 久久国产欧美日韩精品| 国产成人精选| 中日韩男男gay无套| 日韩精品欧美精品| 精品国产黄a∨片高清在线| 激情久久五月| 亚洲精品黄色| 国产极品一区| 久久中文视频| 亚洲精品第一| av中文资源在线资源免费观看| 1000部精品久久久久久久久| 麻豆亚洲精品| 国产精品亚洲人成在99www| 日韩国产一区二区| 国产一级久久| 国产精品免费99久久久| 肉色欧美久久久久久久免费看 | 久久久成人网| 欧美一区三区| 日本一区二区三区视频在线看| 久久精品免费看| 9色精品在线| 国产精品xxx在线观看| 国产精品av一区二区| 欧美日韩18| 亚洲香蕉网站| 国产亚洲观看| 午夜国产一区二区| 欧美激情一区| 红桃视频国产精品| 麻豆成人91精品二区三区| 狠狠色综合网| 国产福利91精品一区二区| 麻豆久久精品| av中文资源在线资源免费观看| 免费观看在线综合色| 92国产精品| 国产乱码精品一区二区三区亚洲人| 欧美日韩精品一区二区视频| 国产日产一区| 日韩精品一二三四| 国产91在线播放精品| 亚洲永久精品唐人导航网址| 免费高潮视频95在线观看网站| 日韩欧美精品一区二区综合视频| 色在线视频观看| 国产日韩一区| 综合激情婷婷| 免费不卡中文字幕在线| 久久久国产精品入口麻豆| 丝袜美腿高跟呻吟高潮一区| 中文在线资源| 国产精品美女午夜爽爽| 日韩专区欧美专区| 99久久久久国产精品| 国产一区二区三区四区二区| 亚洲精品一级| 亚洲一区欧美二区| 日韩毛片视频| 久久精品国产99国产精品| 日韩一二三区在线观看| 一区在线免费| 久久国产欧美| 色婷婷综合网| 久久99精品久久久久久园产越南| 亚洲资源网站| 免播放器亚洲| 精品中文一区| 91看片一区| 久久精品亚洲一区二区| 青青国产精品| 丝袜美腿亚洲一区二区图片| 99精品国产一区二区三区| 精品国产乱码久久久久久樱花| 91精品啪在线观看国产爱臀| 蜜臀av一区二区在线免费观看 | 丝袜美腿高跟呻吟高潮一区| 国产精品99免费看| av亚洲一区二区三区| 精品精品国产三级a∨在线| 国产精品一卡| 国产亚洲久久| 欧美亚洲国产日韩| 日韩精品一页| 亚洲一区导航| 免费国产亚洲视频| 国产免费成人| 香蕉成人久久| 久久亚洲精品伦理| 欧美一区=区| 亚洲欧美日韩国产| 欧美午夜不卡| 99国产精品久久久久久久成人热 | 精品久久免费| 电影91久久久| 日韩88av| 国产精品福利在线观看播放| 国产成人精品亚洲线观看 | 欧美精品不卡| 久久精品国产一区二区| 免费亚洲婷婷| 国产精品久久久久久久免费观看| 久久久久亚洲精品中文字幕| 里番精品3d一二三区| 国产一区二区精品久| 久久uomeier| 青青青免费在线视频| 精品国产精品久久一区免费式| 久久亚洲道色| 最近高清中文在线字幕在线观看1| 国产精品13p| 999国产精品永久免费视频app| 精品欧美久久| 亚洲永久字幕| 日韩在线成人| 欧美日一区二区在线观看| 国产精品美女久久久久久不卡| 国产精品免费不| 中文字幕在线视频久| av亚洲免费| 亚洲三级视频| 国产精品手机在线播放| 国产精品qvod| 日韩精品dvd| 亚洲免费一区二区| 国产日产高清欧美一区二区三区| 精品日韩一区| 国产精品99一区二区| 免费国产亚洲视频| 国产日韩欧美一区在线| 国产v日韩v欧美v| 黄页网站一区| 欧美一区二区三区久久| 国产一区二区三区久久久久久久久| 亚洲不卡系列| 天堂va蜜桃一区二区三区| 69堂精品视频在线播放| 成人在线免费观看网站| 色88888久久久久久影院| 蜜桃91丨九色丨蝌蚪91桃色| 国产精品白浆| 亚洲午夜视频| 日韩成人一级| 免费高潮视频95在线观看网站| 玖玖精品视频| 成人台湾亚洲精品一区二区| 91久久午夜| 美女精品一区二区| 亚洲精品国产偷自在线观看| 91福利精品在线观看| 日韩免费福利视频| 亚洲精品日韩久久| 久久不见久久见免费视频7| 夜鲁夜鲁夜鲁视频在线播放| 喷白浆一区二区| 国产一区二区三区天码| 亚洲欧美日韩一区在线观看| 精品久久亚洲| 亚洲我射av| 日韩中文在线电影| 亚洲区第一页| 成人久久一区| 国产亚洲一卡2卡3卡4卡新区| 99热精品久久| 国产欧美日韩免费观看| 自由日本语亚洲人高潮| 麻豆一区二区三区| 午夜久久福利| 久久伊人国产| 亚洲影院天堂中文av色| 色天使综合视频| 日本va欧美va精品| 国产高清一区| 丁香婷婷久久| 精品国产精品国产偷麻豆| 中文字幕免费一区二区|