Tomcat線程池原理

1. 一個 SpringBoot 項目能同時處理多少請求?tomcat容器,

200 次。

2. 怎么來的?

而點擊這些線程,查看其堆棧消息,可以看到 Tomcat、threads、ThreadPoolExecutor 等關鍵字
在這里插入圖片描述
基于“短時間內有 200 個請求被立馬處理的”這個現象,結合你背的滾瓜爛熟的、非常扎實的線程池知識,你先大膽的猜一個:Tomcat 默認核心線程數是 200。

從這個調用棧中,由于我們要找的是 Tomcat 線程池相關的源碼,所以第一次出現相關關鍵字的地方就是這一行:

org.apache.Tomcat.util.threads.ThreadPoolExecutor.Worker#run

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
corePoolSize,核心線程數,值為 10。

maximumPoolSize,最大線程數,值為 200。

而且基于 maximumPoolSize 這個參數,你往前翻代碼,會發現這個默認值就是 200:
隊列長度,值為 Integer.MAX_VALUE。

在這里插入圖片描述
在這里插入圖片描述
這個方法里面,標號為 ① 的地方,就是判斷當前工作線程數是否小于核心線程數,小于則直接調用 addWorker 方法,創建線程。

標號為 ② 的地方主要是調用了 offer 方法,看看隊列里面是否還能繼續添加任務。

如果不能繼續添加,說明隊列滿了,則來到標號為 ③ 的地方,看看是否能執行 addWorker 方法,創建非核心線程,即啟用最大線程數。

把這個邏輯捋順之后,接下來我們應該去看哪部分的代碼,就很清晰了。

主要就是去看 workQueue.offer(command) 這個邏輯。

如果返回 true 則表示加入到隊列,返回 false 則表示啟用最大線程數嘛。

這個 workQueue 是 TaskQueue,看起來一點也不眼熟:
在這里插入圖片描述
當然不眼熟了,因為這個是 Tomcat 自己基于 LinkedBlockingQueue 搞的一個隊列。

在這里插入圖片描述

重點:題的答案就藏在 TaskQueue 的 offer 方法里面。

在這里插入圖片描述
parent 就是 Tomcat 線程池,通過其 set 方法可以知道,是在線程池完成初始化之后,進行了賦值。

也就是說,你可以理解為,在 Tomcat 的場景下,parent 不會為空。

標號為 ② 的地方,調用了 getPoolSizeNoLock 方法:
就表明當前線程池的線程數已經是配置的最大線程數了,那就調用 offer 方法,把當前請求放到到隊列里面去。

標號為 ③ 的地方,是判斷已經提交到線程池里面待執行或者正在執行的任務個數,是否比當前線程池的線程數還少。

如果是,則說明當前線程池有空閑線程可以執行任務,則把任務放到隊列里面去,就會被空閑線程給取走執行。

然后,關鍵的來了,標號為 ④ 的地方。

重點:如果當前線程池的線程數比線程池配置的最大線程數還少,則返回 false。

前面說了,offer 方法返回 false,會出現什么情況?
在這里插入圖片描述
是不是直接開始到上圖中標號為 ③ 的地方,去嘗試添加非核心線程了?

也就是啟用最大線程數這個配置了。

3. JDK線程池和Tomcat線程池原理不一樣

JDK 的線程池,是先使用核心線程數配置,接著使用隊列長度,最后再使用最大線程配置。
Tomcat 的線程池,就是先使用核心線程數配置,再使用最大線程配置,最后才使用隊列長度。

https://mp.weixin.qq.com/s/PXC4pFE_ZpydBAzCJZmiqQ

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/34684.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/34684.shtml
英文地址,請注明出處:http://en.pswp.cn/news/34684.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

分類預測 | Python實現LR邏輯回歸多輸入分類預測

分類預測 | Python實現LR邏輯回歸多輸入分類預測 目錄 分類預測 | Python實現LR邏輯回歸多輸入分類預測基本介紹模型描述源碼設計學習小結參考資料基本介紹 邏輯回歸是一種廣義線性的分類模型且其模型結構可以視為單層的神經網絡,由一層輸入層、一層僅帶有一個sigmoid激活函數…

設計模式十二:享元模式(Flyweight Pattern)

當我們需要創建大量相似對象時,享元模式可以幫助我們節省內存空間和提高性能。該模式通過共享相同的數據來減少對象的數量。 在享元模式中,有兩種類型的對象:享元(Flyweight)和非享元(Unshared Flyweight&a…

Postman下載教程

目錄 下載 安裝 注意事項 看到很多小伙伴在問 Postman 下載的相關問題,花時間整理了下,下面教新入門的小伙伴如何去下載 Postman。 開始前我們可以先了解下:Postman 簡介 下載 第一步:進入 Postman 官網 首先,我…

maven打包上傳到私有倉庫的步驟

maven打包上傳到私有倉庫的步驟 一、pom.xml引入二、Maven的settings.xml三、pom.xml中添加源碼插件四、執行發布命令 先準備私庫地址: http://localhost:8081/nexus3/repository/maven-releases http://localhost:8081/nexus3/repository/maven-snapshots 假如現需…

如何在Vue表單處理中實現表單字段的文件下載

Vue.js 是一種流行的JavaScript框架,用于構建用戶界面。在Vue應用中,我們經常需要處理表單操作,其中一個常見需求是實現文件下載。以下介紹如何在Vue表單處理中實現表單字段的文件下載,大家共同交流。 一、使用HTML的a標簽實現文…

Java單例模式詳解(五種實現方式)

1、什么是單例模式? Java單例模式是一種設計模式,用于確保一個類只有一個實例,并提供全局訪問點以獲取該實例。它通常用于需要共享資源或控制某些共享狀態的情況下。 例如: 一個日志記錄器(Logger)。在一個…

二級考python和c語言哪個好,計算機二級python和c

大家好,小編來為大家解答以下問題,二級python和二級c語言哪個更吃香一些,二級python和二級c語言哪個更吃香一點,今天讓我們一起來看看吧! 計算機二級貌似只是在校園里的自嗨,出來工作后并沒有覺得這個證書有…

JavaScript+Asp.Net MVC5同時下載多個文件

前端同時啟動多個下載任務(但是沒有做壓縮包下載) 前端JavaScript腳本: var idList [1,2,3];//要下載的列表 $.each(idList, function (index, item) {downloadURL("/File/GetPdf?id" item); });var count 0; var downloadUR…

LeetCode 21.合并兩個有序鏈表

文章目錄 💡題目分析💡解題思路🚩思路1: 歸并排序思想(不使用帶哨兵衛的頭節點)🔔接口源碼: 💡解題思路🚩思路2: 歸并排序思想(使用帶哨兵衛的頭節點&#xf…

Ubuntu安裝JDK與IntelliJ IDEA

目錄 前言 Ubuntu 安裝 JDK 1、更新軟件包列表 2、安裝OpenJDK 3、驗證安裝 Ubuntu安裝IntelliJ IDEA 1、下載 IntelliJ IDEA 2、解壓縮 IntelliJ IDEA 安裝包 3、移動 IntelliJ IDEA 到安裝目錄 4、啟動 IntelliJ IDEA 前言 APT(Advanced Package Tool&…

web-xss-dvwa

目錄 xss(reflected) low medium high xss(store) low medium high xss(dom) low medium high xss(reflected) low 沒有什么過濾,直接用最普通的標簽就可以了 http://127.0.0.1/DVWA-master/vulnerabili…

C++ STL vector 模擬實現

?<1>主頁&#xff1a;我的代碼愛吃辣 &#x1f4c3;<2>知識講解&#xff1a;C之STL &#x1f525;<3>創作者&#xff1a;我的代碼愛吃辣 ??<4>開發環境&#xff1a;Visual Studio 2022 &#x1f4ac;<5>前言&#xff1a;上次我們已經數字會用…

【uniapp使用web-view點擊返回報錯后返回不了】

問題及解決 問題解決 問題 使用web-view跳轉到別人的網站之后點擊返回報錯&#xff0c;返回不了 解決 使用以下方法 <template><view></view> </template> <script> var wv;//計劃創建的webview export default {onLoad() {// #ifdef APP-PL…

(杭電多校)2023“釘耙編程”中國大學生算法設計超級聯賽(7)

1002 Random Nim Game 只有3種情況,要么必贏,要么必輸,要么從宏觀角度考慮,隨機的話,贏的概率就是1/2(就像拋硬幣一樣,隨著拋的次數越來越多,正反面的概率將越來越接近1) 當只要有一堆石頭數量不是1,那么就是必贏或必輸,贏的概率就是1/2 當每堆石頭數量都為1時,當堆數為奇數…

unity新輸入系統的簡單使用(New InputSystem)

1、在包管理器 unity注冊表中下載安裝InputSystem 2、給玩家添加組件PlayerInput&#xff0c;點擊CreatAction,創建一個InputAct InputAct,這是玩家的輸入文件&#xff0c;在里面可以設置玩家輸入 3、使用 例如玩家控制角色移動 在InputAct中&#xff0c;默認已經設置好了移…

學習pytorch 2 導入查看dataset

學習pytorch 2 2. dataset實戰代碼數據集 2. dataset實戰 B站小土堆視頻 代碼 from torch.utils.data import Dataset from PIL import Image #import cv2 import osclass MyData(Dataset):def __init__(self, root_dir, label_dir):self.root_dir root_dirself.label_dir …

【Unity實戰100例】人物狀態欄UI數據刷新—MVC觀察者模式

目錄 一.創建Model層數據模型 二.創建View層關聯UI組件 三.創建Controller層使得V和M數據關聯 源碼:htt

[python]RuntimeError: Can‘t decrement id ref count (unable to close file...

使用spectralspatial模型進行EEG分類時&#xff0c;出現以下錯誤 RuntimeError: Cant decrement id ref count (unable to close file, errno 5, error message Input/output error) Segmentation fault (core dumped) 猜測是因為存儲的model太大了導致的&#xff0c;找到了…

hive 中最常用日期處理函數

hive 常用日期處理函數 在工作中&#xff0c;日期函數是提取數據計算數據必須要用到的環節。哪怕是提取某個時間段下的明細數據也得用到日期函數。今天和大家分享一下常用的日期函數。為什么說常用呢&#xff1f;其實這些函數在數據運營同學手上是幾乎每天都在使用的。 技術交…

FreeRTOS(計數信號量)

資料來源于硬件家園&#xff1a;資料匯總 - FreeRTOS實時操作系統課程(多任務管理) 目錄 一、計數信號量的定義與應用 1、計數信號量的定義 2、計數信號量的應用 二、計數信號量的運作機制 1、任務間計數信號量的實現 三、計數信號量常用的API函數 1、計數信號量典型流程…