福田网站建设论文结论,公司网站背景图片,龙海做网站费用,长沙做黄叶和网站的公司有哪些1. 一个 SpringBoot 项目能同时处理多少请求#xff1f;tomcat容器#xff0c;
200 次。
2. 怎么来的#xff1f;
而点击这些线程#xff0c;查看其堆栈消息#xff0c;可以看到 Tomcat、threads、ThreadPoolExecutor 等关键字 基于“短时间内有 200 个请求被立马处理…1. 一个 SpringBoot 项目能同时处理多少请求tomcat容器
200 次。
2. 怎么来的
而点击这些线程查看其堆栈消息可以看到 Tomcat、threads、ThreadPoolExecutor 等关键字 基于“短时间内有 200 个请求被立马处理的”这个现象结合你背的滚瓜烂熟的、非常扎实的线程池知识你先大胆的猜一个Tomcat 默认核心线程数是 200。
从这个调用栈中由于我们要找的是 Tomcat 线程池相关的源码所以第一次出现相关关键字的地方就是这一行
org.apache.Tomcat.util.threads.ThreadPoolExecutor.Worker#runcorePoolSize核心线程数值为 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