建设网站前市场分析,网站开发视频代码,百度网站查反链,新能源汽车十大名牌tomcat两大组件#xff1a;连接器Connector#xff0c;容器Container
tomcat线程池 Tomcat线程池扩展了ThreadPoolExecutor#xff0c;行为稍有不同 重写了ThreadPoolExecutor的execute方法 如果总线程数达到maximumPoolSize#xff0c;不会立刻抛RejectedExecutionExcept…tomcat两大组件连接器Connector容器Container
tomcat线程池 Tomcat线程池扩展了ThreadPoolExecutor行为稍有不同 重写了ThreadPoolExecutor的execute方法 如果总线程数达到maximumPoolSize不会立刻抛RejectedExecutionException异常 而是再次尝试将任务放入队列如果还失败才抛出RejectedExecutionException异常
tomcat线程池相关的配置
Connector配置对应server.xml中的Connector标签
acceptor线程数量(建立socket连接,这个线程很多时候在阻塞状态,没有新的连接就会等待,所以1个线程足够了)-acceptorThreadCount(default 1)
poller线程数量(采用了多路复用的思想,1个线程就能监测多个channel的读写事件)-pollerThreadCount(default 1)
Executor线程池中的核心线程数-minSpareThreads(default 10)
Executor线程池中的最大线程数-maxThreads(default 200)
Executor名称(引用Executor标签)-会覆盖掉minSpareThreads和maxThreads的值Executor线程配置对应server.xml中的Executor标签
线程优先级 - threadPriority(default 5)
是否守护线程 - daemon(default true)
核心线程数 - minSpareThreads(default 25)
最大线程数 - maxThreads(default 200)
非核心线程空闲生存时间 - maxIdleTime(default 60000)1分钟
队列长度 - maxQueueSize(default Integer.MAX_VALUE)
核心线程是否在服务器启动时启动 - prestartminSpareThreads(default false)核心类 org.apache.catalina.startup.Catalina#createStartDigester方法解析server.xml标签 Executor标签默认使用的这个StandardThreadExecutor启动核心方法startInternalexecute 但是SpringBoot中好像没用这个StandardThreadExecutor tomcat中有一个同名的ThreadPoolExecutor继承了JDK的ThreadPoolExecutor
// TaskQueue是Tomcat中的任务队列
// org.apache.tomcat.util.threads.TaskQueue.java
// public class TaskQueue extends LinkedBlockingQueueRunnable// 线程池中的线程数 核心线程数时,会直接创建新线程执行该任务
// calling this method when 线程池中的线程数 核心线程数
// TaskQueue重写了offer方法
public boolean offer(Runnable o) {if (this.parent null) {return super.offer(o);// 线程池中的线程数 最大线程数} else if (this.parent.getPoolSize() this.parent.getMaximumPoolSize()) {return super.offer(o);// 线程池中的线程数 队列里的任务和已经在执行但是还没执行完的任务} else if (this.parent.getSubmittedCount() this.parent.getPoolSize()) {return super.offer(o);} else {// 线程池中的线程数 最大线程数(此时会返回false,导致execute方法中调用addWorker方法创建一个线程)return this.parent.getPoolSize() this.parent.getMaximumPoolSize() ? false : super.offer(o);}
}SpringBoot启动时Tomcat启动的过程从Spring的run方法开始一些关键节点
TomcatWebServer.class:185
WebServerStartStopLifecycle.class:22
DefaultLifecycleProcessor.class:123
DefaultLifecycleProcessor.class:294
DefaultLifecycleProcessor.class:100
DefaultLifecycleProcessor.class:74
AbstractApplicationContext.class:527
AbstractApplicationContext.class:296
TomcatWebServer.class:167
TomcatWebServer.class:166
TomcatWebServer.class:83
TomcatWebServer.class:75
TomcatWebServer.class:60
TomcatServletWebServerFactory.class:409
TomcatServletWebServerFactory.class:145
TomcatServletWebServerFactory.class:127
ServletWebServerApplicationContext.class:102
ServletWebServerApplicationContext.class:81
AbstractApplicationContext.class:293
AbstractApplicationContext.class:279
SpringApplication.class:493
SpringApplication.class:268
SpringApplication.class:171
WeiXinApplication.java:13tomcat的线程池机制 Tomcat线程池原理 Executor官方配置文档 tomcat-超详细的启动流程 SpringBoot启动流程之tomcat启动流程 SpringBoot中Tomcat是如何启动的