并发编程学习(十四):tomcat线程池

news2024/10/7 12:26:17

1、Tomcat 功能组件结构

        Tomcat 的核心功能有两个,分别是负责接收和反馈外部请求的连接器 Connector,和负责处理请求的容器 Container。 其中连接器和容器相辅相成,一起构成了基本的 web 服务 Service。每个 Tomcat 服务器可以管理多个 Service。

  • Connector:负责对外接收和响应请求。它是Tomcat与外界的交通枢纽,监听端口接收外界请求,并将请求处理后传递给容器做业务处理,最后将容器处理后的结果响应给外界。
  • Container:负责对内处理业务逻辑。其内部由 Engine、Host、Context和Wrapper 四个容器组成,用于管理和调用 Servlet 相关逻辑。
  • Service:对外提供的 Web 服务。主要包含 Connector 和 Container 两个核心组件,以及其他功能组件。Tomcat 可以管理多个 Service,且各 Service 之间相互独立。

1.1、Container 结构分析:

      每个 Service 会包含一个 Container 容器。在 Container 内部包含了 4 个子容器,分别如下:

  • Engine:引擎,用来管理多个虚拟主机,一个 Service 最多只能有一个 Engine;
  • Host:代表一个虚拟主机,也可以叫站点,通过配置 Host 就可以添加站点;
  • Context:代表一个 Web 应用,包含多个 Servlet 封装器;
  • Wrapper:封装器,容器的最底层。每一 Wrapper 封装着一个 Servlet,负责对象实例的创建、执行和销毁功能。

       Engine、Host、Context 和 Wrapper,这四个容器之间属于父子关系。
      容器( Container)由一个引擎(Engine)可以管理多个虚拟主机(Host)。每个虚拟主机(Host)可以管理多个 Web 应用(Context),每个 Web 应用会有多个 Servlet 封装器(Wrapper)。

2、tomcat线程池

tomcat中connector连接器部分使用到了线程池。

  1. LimitLatch:用来限流,可以恐怕该男子最大连接个数,类似J.U.C中的Semaphore.
  2. Acceptor只负责【接收新的socket连接】,默认线程数量为1,已足够使用。
  3. Poller :只负责监听socket channel是否有【可读的I/O事件】,默认线程数量为1,采用的是多路复用,已足够使用。
  4. 一旦可读,封装一个任务对象(sockerProcessor),提交给Executor线程池处理。
  5. Executor线程池中的工作线程最终负责【处理请求】

2.1、tomcat线程池扩展了ThreadPoolExecutor

 tomcat线程池扩展了ThreadPoolExecutor,行为稍有不同,如果总线程数达到了maxPoolSize, 

  • 不会立即抛RejectedExecutionException异常;
  • 而是再次尝试将任务放入队列,如果还失败,才抛出RejectedExecutionException异常。

源码如下:(tomcat9.0.21) 

package org.apache.tomcat.util.threads;

public class ThreadPoolExecutor extends java.util.concurrent.ThreadPoolExecutor {

// 此处省略部分代码...

	public void execute(Runnable command, long timeout, TimeUnit unit) {
		this.submittedCount.incrementAndGet();

		try {
			super.execute(command);
		} catch (RejectedExecutionException var9) {
			if (!(super.getQueue() instanceof TaskQueue)) {
				this.submittedCount.decrementAndGet();
				throw var9;
			}

			TaskQueue queue = (TaskQueue)super.getQueue();

			try {
				if (!queue.force(command, timeout, unit)) {
					this.submittedCount.decrementAndGet();
					throw new RejectedExecutionException(sm.getString("threadPoolExecutor.queueFull"));
				}
			} catch (InterruptedException var8) {
				this.submittedCount.decrementAndGet();
				throw new RejectedExecutionException(var8);
			}
		}

	}

// 此处省略部分代码...

}

tomcat跟线程池相关的配置如下:

2.2、tomcat线程池相关的配置

tomcat 之service.xml 中线程池的配置部分如下:

<!--The connectors can use a shared executor, you can define one or more named thread pools-->
    <!--
    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="150" minSpareThreads="4"/>
    -->

    <!-- A "Connector" represents an endpoint by which requests are received
         and responses are returned. Documentation at :
         Java HTTP Connector: /docs/config/http.html
         Java AJP  Connector: /docs/config/ajp.html
         APR (HTTP/AJP) Connector: /docs/apr.html
         Define a non-SSL/TLS HTTP/1.1 Connector on port 8080
    -->
  <Connector port="8180" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <!-- A "Connector" using the shared thread pool-->
    <!--
    <Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    -->

2.12.1、connector配置

        对应service.xml中的<connector>标签配置。

 <Connector port="8180" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

 

 

 

 

 

 

 

 

 

 

 

 

2.2.2、Executor配置

        对应service.xml中的<executor>标签配置,用于在<connector>标签中引用。service.xml原配置中的注释代码放开后如下:

	<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="150" minSpareThreads="4"/>

    <Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

 

 

 

       

 默认队列长度是Integer.MAX_VALUE,相当于是无界队列,是否表示非核心线程(即救急线程)永远不会被创建?

tomcat线程池工作流程图如下:

 1、有新任务时,核心线程数是否都用完了(即核心线程是否都繁忙),如果还有空闲核心线程,则将新任务添加到队列。

2、如果没有空闲核心线程,判断是否有救急线程,有,则创建救急线程或使用空闲的救急线程,执行任务。

3、如果救急线程都繁忙,则将新任务加入对列,加入规则如 2.1章节说明

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/593174.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

同声传译方法有哪些?我来给你介绍三个同声传译的好方法

假设有一场国际性的会议&#xff0c;参会者来自不同的国家和语言背景。在会议中&#xff0c;主要的演讲和讨论都是以主持人或演讲者的母语进行&#xff0c;这个时候场中的其他人很可能因为语言不通而无法理解演讲的内容&#xff0c;而翻译人员人数不足的时候&#xff0c;就更难…

Nmap常用基础命令详解

阅读目录 Nmap 主机发现扫描 Nmap 使用扫描脚本 Nmap 内网服务扫描 Nmap 是免费开放源代码实用程序&#xff0c;用于网络发现和安全审核。许多系统和网络管理员还发现它对于诸如网络清单&#xff0c;管理服务升级计划以及监视主机或服务正常运行时间之类的任务很有用。Nmap以…

2023全国科技工作者日——回顾2023小蛮腰科技大会暨AIGC人工智能峰会,致敬全国科技工作者

文章目录 一、前言二、2023全国科技工作者日三、回顾2023小蛮腰科技大会暨AIGC人工智能峰会3.1 关于小蛮腰科技大会暨AIGC人工智能峰会的背景3.2 2023小蛮腰科技大会&#xff1a;探寻AIGC新未来3.2.1 开幕式暨主论坛3.2.2 平行论坛1&6&#xff1a;迈向智能时代&#xff0c;…

Linux系统下imx6ull QT编程—— C++构造函数、析构函数、this指针(四)

Linux QT编程 文章目录 Linux QT编程一、什么是构造函数&#xff1f;二、什么是析构函数&#xff1f;三、示例四、this指针 一、什么是构造函数&#xff1f; 构造函数在对象实例化时被系统自动调用&#xff0c;仅且调用一次。前面我们学过类&#xff0c;实际上定义类时&#x…

普源DG1062Z函数/任意波形发生器产品介绍

DG1000Z系列函数/任意波形发生器是一款集函数发生器、任意波形发生器、噪声发生器、脉冲发生器、谐波发生器、模拟/数字调制器、频率计等功能于一身的多功能信号发生器。该系列所有型号皆具有2个功能*相同的通道&#xff0c;通道间相位可调。 产品特性 SiFi(Signal Fidelity)…

Android UEvent事件分析

1.背景概述 众所周知,在安卓系统中有状态栏,在插入外设的时候,会在顶部状态栏显示小图标。 比如,camera设备,耳机设备,U盘,以及电池等等。这些都需要在状态栏动态显示。 从上面这张图片可以看出这些设备都有自己的服务一直在跑,并且都是继承了UEventObserver.java这个…

自学网络安全/Web安全,一般人真的不行

本人之前写了不少网络安全技术相关的文章&#xff0c;不少读者朋友知道我是从事网络安全相关的工作&#xff0c;于是经常有人私信问我&#xff1a; 我刚入门网络安全&#xff0c;该怎么学&#xff1f; 要学哪些东西&#xff1f; 有哪些方向&#xff1f; 怎么选&#xf…

Windows和Linux服务器给图片添加水印两种方法,引用字体库和自带字体库

文章目录 一、效果展示二、前提说明三、Windows自带字体库实现方法四、引入字体库实现方法 一、效果展示 水印123如下图 1.可以自定义&#xff08;类型&#xff1a;汉字、数字都支持&#xff09; 2.可以定位指定位置 二、前提说明 实现添加水印功能中Windows服务器和Linux服…

系统日志管理

什么是系统日志 系统日志由 Linux/Unix 和其他网络设备&#xff08;如交换机、路由器和防火墙&#xff09;生成。系统日志包含有价值的信息&#xff0c;有助于保护网络和解决操作问题。因此&#xff0c;收集和分析系统日志至关重要。 系统日志包含什么 系统日志标准包含三个不…

Linux:MBR 扇区故障处理 (备份|恢复)

大概思路&#xff1a; 我们准备一个硬盘&#xff0c;并分出一个分区用于单独存放MBR备份文件 或者 和别的文件放在一起也可以&#xff08;前提是不怕乱&#xff09; 然后将分区挂载 然后进行MBR备份 把备份文件放到分区里 然后对MBR进行破坏&#xff08;仅供实验参考&…

选择好的自动化测试工具影响会很大

根据当前项目和QA团队的人员能力&#xff0c;选择的自动化测试工具除具有使用的广泛性外&#xff0c;还必须考虑许多不同方面兼容性&#xff0c;例如项目迭代范围和需求变更。最佳工具并不能保证最佳的测试使用结果。 测试自动化的意义 随着自动化测试的普及&#xff0c;有关…

iPhone漏电10年大量用户受伤,官方回应:建议戴套

由于欧盟的强制要求&#xff0c;苹果用了多年的 Lightning 终于走到了尽头。 今年开始&#xff0c;包括 iPhone 15 全机型都将统一更换为 Type-C 接口。 对重视使用体验的用户来说&#xff0c;简直大快人心。 之前的 Lightning 不光蹭充电器相对麻烦&#xff0c;USB 2.0 的速…

可配置Modbus网关 嵌入式设备联网解决方案

1.概述 可配置Modbus网关可以预先配置Modbus RTU端的设备的地址、功能码和寄存器列表&#xff0c;并存储到网关内部。网关会自动采集这些配置的RTU设备的数据&#xff0c;然后映射到连续的Modbus TCP寄存器地址&#xff0c;从而允许Modbus TCP端一次性读取所有的设备的不同寄存…

基于AT89C51单片机的电子密码锁设计

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87848194?spm=1001.2014.3001.5503 源码获取 摘 要 随着经济社会发展,人们生活水平的提高,如何实现家庭防盗这一问题也变的尤其的突出。传统的机械锁,由于其构造简单,安…

手机卡停机三个月被自动注销,欠费需要补交吗?不交会影响征信?

经常换手机卡的朋友都会面临着这样的一个问题&#xff0c;手机卡欠费不用而且忘了注销&#xff0c;三个月过后自动注销了&#xff0c;这样就会面临着一个问题&#xff0c;欠费应该怎么处理&#xff0c;需要补交吗&#xff1f;如果不补交会影响个人征信吗&#xff1f; 官方解释是…

电商服务智能解决方案

互联网时代&#xff0c;智能客服已成为电商企业客户服务、管理和运营的标配。面临大量客户咨询、订单流程等业务&#xff0c;传统人工客服工作时间有限、人员流动性大、人工成本持续上涨等&#xff0c;已经无法满足电商企业“数智化”转型的需求&#xff0c;这也促使AI成为电商…

线程池及gdb调试多线程

一、线程池概念和使用 概念&#xff1a;通俗的讲就是一个线程的池子&#xff0c;可以循环的完成任务的一组线程集合 必要性&#xff1a; 我们平时创建一个线程&#xff0c;完成某一个任务&#xff0c;等待线程的退出。但当需要创建大量的线程时&#xff0c;假设T1为创建线程…

Breakdance Builder评测 – 快速构建网站?

您是否正在寻找一个WordPress页面构建器&#xff0c;它可以轻松快速地构建网站 – 而不会使网站臃肿&#xff1f;如果是这样&#xff0c;您可能希望继续阅读这篇Breakdance Builder评测。 在构建网站时&#xff0c;速度就是一切。 编辑器在后端加载的速度有多快&#xff1f;您…

Vue + intro.js 实现页面新手引导流程功能

效果图&#xff1a; 1、安装 intro.js npm install intro.js --save 2、在项目的 main.js 中&#xff0c;引入 intro.js 库和相关样式文件&#xff0c;如下&#xff1a; // 首页引导插件 import intro from intro.js // introjs库 import intro.js/introjs.css // introjs默…

民宿小程序源码,开启民宿新模式

今天我为大家带来了一份最新的民宿小程序源码&#xff01;这个源码不仅可以帮助你开启民宿新模式&#xff0c;还可以让你轻松实现线上预订、在线客服等多种功能。 民宿小程序源码&#xff0c;是什么&#xff1f; 民宿小程序源码是一款基于微信小程序平台的民宿管理系统&#…