关于springboot访问tomcat,线程http-nio-8080-exec的来源问题

2023-05-16

最近在看并发操作时候,例如jmeter进行接口压测(本地自己的springboot2的环境),发现一个有趣的现象,就是关于线程http-nio-8080-exec-1,http-nio-8080-exec-2等等的出现。但是这个线程数不管我的压测数是多少这个线程数不会超过10.抱着好奇的心去搜索了一下相关的文章,但是没有看到比较合适的。然后就只有自己去跟了一下源码。在此自己总结一下。

两个问题:

1、这个http-nio-8080-exec东西是怎么来的
2、为什么这个线程数不超过10

把这两个问题其实可以一起归为一个问题来跟代码进行解决:
因为我们知道,一般在自定义线程或者线程池名称的时候,我们是可以自己去设置相关的线程名字的。这个名称的来源就是如下:

在请求线程经过Tomcat时,会进入到org.apache.coyote.AbstractProtocol,这个方法,这是一个抽象类,可以看出其实这里就是在进行一个名称和端口号的拼接操作。getNamePrefix()的具体实现是在org.apache.coyote.http11.Http11NioProtocol

private String getNameInternal() {
        StringBuilder name = new StringBuilder(getNamePrefix());
        name.append('-');
        if (getAddress() != null) {
            name.append(getAddress().getHostAddress());
            name.append('-');
        }
        int port = getPortWithOffset();
        if (port == 0) {
            // Auto binding is in use. Check if port is known
            name.append("auto-");
            name.append(getNameIndex());
            port = getLocalPort();
            if (port != -1) {
                name.append('-');
                name.append(port);
            }
        } else {
            name.append(port);
        }
        return name.toString();
    }

@Override
    protected String getNamePrefix() {
        if (isSSLEnabled()) {
            return "https-" + getSslImplementationShortName()+ "-nio";
        } else {
            return "http-nio";
        }
    }

当创建连接的时候回进入到org.apache.tomcat.util.net.AbstractEndpoint,进入start()方法

 public final void start() throws Exception {
        if (bindState == BindState.UNBOUND) {
            bindWithCleanup();
            bindState = BindState.BOUND_ON_START;
        }
        startInternal();
    }

然后是startInternal(),在这个方法有一段

if (getExecutor() == null) {
createExecutor();
}。也就是说,如果这个是一个新连接的话,会去新建一个线程。createExecutor()这个方法很重要算是核心实现了。

public void createExecutor() {
        internalExecutor = true;
        TaskQueue taskqueue = new TaskQueue();
        TaskThreadFactory tf = new TaskThreadFactory(getName() + "-exec-", daemon, getThreadPriority());
        executor = new ThreadPoolExecutor(getMinSpareThreads(), getMaxThreads(), 60, TimeUnit.SECONDS,taskqueue, tf);
        taskqueue.setParent( (ThreadPoolExecutor) executor);
    }

从这里可以看到,这个创建连接的过程,就是通过网一个队列进行添加。这个getName()方法就是刚刚上面返回的http-nio-8080的那一部分。

这里可以看到构造一个TaskThreadFactory类。构造方法如下

public TaskThreadFactory(String namePrefix, boolean daemon, int priority) {
        SecurityManager s = System.getSecurityManager();
        group = (s != null) ? s.getThreadGroup() : Thread.currentThread().getThreadGroup();
        this.namePrefix = namePrefix;
        this.daemon = daemon;
        this.threadPriority = priority;
    }

重点看这个group,他是属于java.lang.ThreadGroup。构造方法中有这样一段代码

private ThreadGroup() {     // called from C code
        this.name = "system";
        this.maxPriority = Thread.MAX_PRIORITY;
        this.parent = null;
    }

Thread.MAX_PRIORITY=10;换言之,就是在通过Tomcat的形式建立连接的时候,新建的连接对象都会有用到ThreadGroup,在ThreadGroup中就有限制最大的数卫10.所以会出现http-nio-8080-exec-9的情况也很正常了。

先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于springboot访问tomcat,线程http-nio-8080-exec的来源问题 的相关文章

随机推荐

  • Hadoop入门学习——简介篇

    Hadoop入门学习 简介篇 文章目录 Hadoop入门学习 简介篇1 大数据概论1 1 分布式 并行 1 2 大数据特点 xff08 4V xff09 1 2 1 Volume xff08 大量 xff09 1 2 2 Velocity
  • Hadoop之分布式技术

    Hadoop之分布式技术 文章目录 Hadoop之分布式技术1 我们为什么需要分布式1 1 计算问题1 2 存储问题 2 分布式系统概述3 分布式实现方案4 分布式系统5 集群6 负载均衡7 弹性8 故障转移 1 我们为什么需要分布式 1
  • 认识DataX及简单入门

    认识DataX及简单入门 文章目录 认识DataX及简单入门1 DataX的概述1 1 什么是DataX1 2 DataX 的设计1 3 支持的数据源1 3 支持的数据源1 4 框架设计1 5 运行原理1 6 DataX和Sqoop的对比
  • Nginx 反向代理及https配置

    参考代码 在server中添加 location api proxy set header Host host proxy set header X Real IP remote addr proxy set header X Forwar
  • DataX使用之基础案例

    DataX使用之基础案例 文章目录 DataX使用之基础案例0 写在前面1 从stream 流读取数据并打印到控制台2 读取 MySQL 中的数据存放到 HDFS2 1 查看官方模板2 1 1 mysqlreader 参数解析 xff1a
  • DataX和Oracle使用案例

    DataX和Oracle使用案例 文章目录 DataX和Oracle使用案例0 写在前面1 从 Oracle 中读取数据存到 MySQL1 1 MySQL 中创建表1 2 编写 Datax 配置文件1 3 执行命令 2 读取 Oracle
  • MongoDB初认识

    MongoDB初认识 文章目录 MongoDB初认识0 写在前面1 MongoDB是什么2 MongoDB的优缺点3 基础概念解析4 安装4 1 下载地址4 2 安装MongoDB4 3 pgrep使用4 4 进入 shell 交互页面 0
  • DataX和MongoDB之间的数据导入导出案例

    DataX和MongoDB之间的数据导入导出案例 文章目录 DataX和MongoDB之间的数据导入导出案例0 写在前面1 MongoDB前置知识1 1 基础概念详解1 1 1 数据库1 1 2 集合1 1 3 文档 xff08 Docum
  • TI Cotex M3/4单片机关于寄存器操作详解

    TI Cotex M3 4单片机关于寄存器操作详解 前备知识寄存器与偏移量位带操作 位带区 TI单片机寄存器操作详解快速在TI的手册里面确认某外设某寄存器的确切地址寄存器操作介绍本文参考 前备知识 当前单片机的开发方式多种多样 xff0c
  • Cannot currently show the desktop

    问题解决办法篇 用VNC打开树莓派桌面时 xff0c 显示 Cannot currently show the desktop 意为当前无法显示桌面 xff0c 其实调整一下分辨率重新打开桌面就好了 法一 xff1a 有显示屏 将树莓派与显
  • 相机标定 >> 坐标系转换@内参、外参

    相机标定 gt gt 坐标系转换 64 内参 外参 1 坐标系介绍1 1 像素坐标系1 2 图像坐标系1 3 相机坐标系1 4 世界坐标系 2 相机标定2 1 内参2 1 1 内参的意义 xff08 透视映射 xff09 2 1 2 内参的
  • 2022年最新前端面试题

    js面试题 1 js数据类型 基本数据类型 Number String Boolean Null Undefined Symbol bigInt引用数据类型 object Array Date Function RegExp 2 js变量和
  • ruoyi(若依)框架使用说明(前后端分离)

    ruoyi 28 E8 8B A5 E4 BE 9D 29 E6 A1 86 E6 9E B6 E4 BD BF E7 94 A8 E8 AF B4 E6 98 8E 28 E5 89 8D E5 90 8E E7 AB AF E5 88
  • 1130 - Host XXX is not allowed to connect to this MySQL server。

    1 在用Navicat配置远程连接Mysql数据库时遇到如下报错信息 xff0c 这是由于Mysql配置了不支持远程连接引起的 2 在安装Mysql数据库的主机上登录root用户 xff1a mysql u root p 3 依次执行如下命
  • 阿里云Ubentu rsync同步文件到多台服务器

    cd usr local wget https rsync samba org ftp rsync src rsync 3 1 1 tar gz tar zxvf rsync 3 1 1 tar gz cd rsync 3 1 1 conf
  • java获取字符串最后一个字符

    第一种 String str 61 34 daipogfhjoripa1 34 char c 61 str charAt str length 1 第二种 str substring str length 1
  • 解决idea中maven依赖unknown的问题

    解决idea中maven依赖unknown的问题 1 出现问题原因 xff1a 最简单的原因是 xff0c 包名之间的横线 中英文切换问题 xff0c 改正就好 xff0c 或者忘记写版本号 从其他地方copy过来的 xff0c 仓库下载失
  • mySql中count带条件查询

    方法一 xff1a SELECT count t command name 61 39 UNLOCK 39 OR NULL unlockFrequency FROM 表 t 方法二 xff1a select count t command
  • tomcat下载安装步骤(超详细)

    下载安装 首先进入tomcat官网 https tomcat apache org 在圈住的位置点击下载自己想要的版本 我选择tomcat9 根据自己电脑下载64位或32位zip版本 下载完毕后解压到自己想放的位置 配置环境变量 在系统变量
  • 关于springboot访问tomcat,线程http-nio-8080-exec的来源问题

    最近在看并发操作时候 xff0c 例如jmeter进行接口压测 xff08 本地自己的springboot2的环境 xff09 xff0c 发现一个有趣的现象 xff0c 就是关于线程http nio 8080 exec 1 xff0c h