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

您的位置:首頁技術(shù)文章
文章詳情頁

Tomcat修正JDK原生線程池bug的實(shí)現(xiàn)原理

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

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

Tomcat 線程池原理

其實(shí)ThreadPoolExecutor的參數(shù)主要有如下關(guān)鍵點(diǎn):

限制線程個(gè)數(shù)

限制隊(duì)列長(zhǎng)度

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

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

Tomcat對(duì)線程數(shù)也有限制,設(shè)置:

  • 核心線程數(shù)(minSpareThreads)
  • 最大線程池?cái)?shù)(maxThreads)

Tomcat線程池還有自己的特色任務(wù)處理流程,通過重寫execute方法實(shí)現(xiàn)了自己的特色任務(wù)處理邏輯:

  1. 前corePoolSize個(gè)任務(wù)時(shí),來一個(gè)任務(wù)就創(chuàng)建一個(gè)新線程
  2. 再有任務(wù),就把任務(wù)放入任務(wù)隊(duì)列,讓所有線程去搶。若隊(duì)列滿,就創(chuàng)建臨時(shí)線程
  3. 總線程數(shù)達(dá)到maximumPoolSize,則繼續(xù)嘗試把任務(wù)放入任務(wù)隊(duì)列
  4. 若緩沖隊(duì)列也滿了,插入失敗,執(zhí)行拒絕策略

和 JDK 線程池的區(qū)別就在step3,Tomcat在線程總數(shù)達(dá)到最大數(shù)時(shí),不是立即執(zhí)行拒絕策略,而是再嘗試向任務(wù)隊(duì)列添加任務(wù),添加失敗后再執(zhí)行拒絕策略。

具體又是如何實(shí)現(xiàn)的呢?

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

定制任務(wù)隊(duì)列

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

submittedCount.incrementAndGet();

任務(wù)執(zhí)行失敗,拋異常時(shí),將該計(jì)數(shù)器減一:

submittedCount.decrementAndGet();

Tomcat線程池使用 submittedCount 變量維護(hù)已提交到線程池,但未執(zhí)行完的任務(wù)數(shù)量。

為何要維護(hù)這樣一個(gè)變量呢?

Tomcat的任務(wù)隊(duì)列TaskQueue擴(kuò)展了JDK的LinkedBlockingQueue,Tomcat給了它一個(gè)capacity,傳給父類LinkedBlockingQueue的構(gòu)造器。

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

capacity參數(shù)通過Tomcat的maxQueueSize參數(shù)設(shè)置,但maxQueueSize默認(rèn)值Integer.MAX_VALUE:當(dāng)前線程數(shù)達(dá)到核心線程數(shù)后,再來任務(wù)的話線程池會(huì)把任務(wù)添加到任務(wù)隊(duì)列,并且總會(huì)成功,就永遠(yuǎn)無機(jī)會(huì)創(chuàng)建新線程了。

為解決該問題,TaskQueue重寫了LinkedBlockingQueue#offer,在合適時(shí)機(jī)返回false,表示任務(wù)添加失敗,這時(shí)線程池就會(huì)創(chuàng)建新線程。

什么叫合適時(shí)機(jī)?

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

所以Tomcat維護(hù) 已提交任務(wù)數(shù) 是為了在任務(wù)隊(duì)列長(zhǎng)度無限時(shí),讓線程池還能有機(jī)會(huì)創(chuàng)建新線程。

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

標(biāo)簽: Tomcat
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
1000部精品久久久久久久久| 欧美日韩视频网站| 国产精品99一区二区| 91视频久久| 国产一区二区三区日韩精品| 国产精品观看| 国产精品66| 国产欧美日韩综合一区在线播放| 亚洲v天堂v手机在线| 蜜桃一区二区三区在线| 免费在线观看不卡| 亚洲资源在线| 日本欧美久久久久免费播放网| 一区在线观看| 亚洲一区不卡| 亚洲涩涩av| 日韩精品五月天| 欧美亚洲网站| 久久wwww| 久久精品动漫| 99精品99| 亚洲综合色婷婷在线观看| 亚洲精品伊人| 国产日韩在线观看视频| 久久久久97| 日韩三区在线| 一二三区精品| 国产欧美一区二区精品久久久| 青青草国产成人99久久| 国产精品日韩精品中文字幕| 国产一区二区三区国产精品| 久久激情中文| 中文字幕av亚洲精品一部二部| 成人在线免费观看91| 亚洲91精品| 视频一区二区三区入口| 日韩高清不卡在线| 成人亚洲精品| 最新日韩av| 国产日韩亚洲欧美精品| 色综合五月天| 免费日韩精品中文字幕视频在线| 日韩不卡手机在线v区| 久久福利在线| 欧美亚洲日本精品| 香蕉视频成人在线观看| 青草av.久久免费一区| 卡一卡二国产精品| 国产综合婷婷| 日本欧美在线| 日韩激情一区| 亚洲精品亚洲人成在线观看| 国模大尺度视频一区二区| 久久高清免费| 欧美日韩18| 久久一级电影| 日韩精品导航| 日本午夜大片a在线观看| 人人爽香蕉精品| 国产精品大片| 不卡一区综合视频| 国产乱子精品一区二区在线观看 | 国产一区调教| 久久午夜精品| 亚洲国产欧美日本视频| 人人爽香蕉精品| 国产一区二区三区不卡视频网站 | 日韩深夜视频| 99精品一区| 99视频一区| 久久婷婷国产| 久久精品免费一区二区三区| 久久只有精品| 久久精品亚洲欧美日韩精品中文字幕| 日韩大片在线| 日本国产精品| 午夜欧美巨大性欧美巨大| 亚洲成人国产| 亚洲精品自拍| 中文字幕在线高清| 色88888久久久久久影院| 国产偷自视频区视频一区二区| 尹人成人综合网| 亚洲69av| japanese国产精品| 婷婷视频一区二区三区| 天堂中文av在线资源库| 国产探花一区| 婷婷综合国产| 欧美精品一区二区久久| 中文字幕乱码亚洲无线精品一区| 麻豆国产欧美一区二区三区 | 五月天久久网站| 国产一区亚洲| 免费人成精品欧美精品| 97成人在线| 999国产精品| 免费久久99精品国产| 日本伊人久久| 韩国精品主播一区二区在线观看| 一区二区高清| 国产探花一区| 日韩avvvv在线播放| 欧美激情综合| 久久精品观看| 日韩av中文字幕一区二区三区| 欧美亚洲一区二区三区| 在线日韩视频| 日韩欧美精品综合| 国产精品久久乐| 亚洲福利精品| 国产成人精品亚洲线观看| 国产精品美女| 亚洲日韩视频| 亚洲欧美专区| 日本在线不卡视频一二三区| 国产免费成人| 最新国产精品| 日韩一区中文| 中文字幕一区二区精品区| 婷婷亚洲综合| 国产中文字幕一区二区三区| 激情久久一区二区| 亚洲综合婷婷| 黑丝一区二区| 亚洲女同中文字幕| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 久久精品人人| 日韩va亚洲va欧美va久久| 日韩欧美精品一区二区综合视频| 99视频精品视频高清免费| 精品国产一区二区三区噜噜噜| 三级欧美在线一区| 欧美一级专区| 夜夜嗨av一区二区三区网站四季av| 日韩av福利| 成人亚洲一区| 三上悠亚国产精品一区二区三区| 九九久久国产| 日本欧美国产| 九九九精品视频| 成人在线视频区| 日韩av电影一区| 国产精品综合| 日本精品影院| 欧美特黄视频| 欧美13videosex性极品| 国产一区二区精品久| 欧美日韩免费观看视频| 国产va免费精品观看精品视频| 日韩电影免费在线观看| 欧美国产一级| 国产综合视频| 欧美午夜不卡影院在线观看完整版免费| 黄色成人91| 999在线观看精品免费不卡网站| 亚洲一区二区网站| 亚洲一区欧美激情| 日本不卡视频在线| 欧美欧美黄在线二区| 美女高潮久久久| 久久精品国产在热久久| 精品一区二区三区四区五区| 美女毛片一区二区三区四区最新中文字幕亚洲 | 99久久亚洲精品| 欧美日韩国产一区精品一区| 中文字幕视频精品一区二区三区| 美女久久一区| 国产日韩欧美中文在线| 国产精品一区二区三区美女| 精品国产成人| 国内精品亚洲| 激情婷婷久久| 性欧美xxxx免费岛国不卡电影| 伊人久久亚洲热| 视频一区国产视频| 国产精品nxnn| 国产欧美一区二区精品久久久 | 精品一区欧美| 日韩精品一区二区三区中文| 国产精品亚洲综合色区韩国| 欧美国产小视频| 国产字幕视频一区二区| 奇米亚洲欧美| 欧美亚洲tv| 亚洲伊人av| 亚洲精品极品少妇16p| 蜜臀91精品一区二区三区| 精品视频久久| 91精品精品| 日本va欧美va精品发布| 精品一区二区三区中文字幕在线| 婷婷成人综合| 伊人国产精品| 亚洲人成在线网站| 日韩一区二区免费看| 久久香蕉网站| 欧美日韩国产高清| 国产精品午夜一区二区三区| 高清日韩欧美|