tomcat源码分析-executor及其实现StandardThreadExecutor

本文深入探讨了Tomcat中用于处理用户请求的StandardThreadExecutor。这是一个实现了Executor接口的类,它扩展了生命周期管理并自定义了线程池行为。StandardThreadExecutor使用TaskQueue,一个基于LinkedBlockingQueue的定制版本,来确保即使在无界队列的情况下,也能充分利用非核心线程。在启动和停止过程中,StandardThreadExecutor遵循特定的生命周期方法,如startInternal和stopInternal。通过重写offer方法,TaskQueue能够在需要时启动额外的线程,从而突破核心线程限制。这种设计提供了更灵活的线程池管理,同时保持了对外部调用的简单性。

executor

executor 是引擎,用户请求是经过executor进行处理的,知觉告诉我们这应该是一个多线程,线程池的容器,我们先从类的关系看下;

public interface Executor extends java.util.concurrent.Executor, Lifecycle {
   
   

    public String getName();

    @Deprecated
    void execute(Runnable command, long timeout, TimeUnit unit);
}

executor是个接口,并继承jdk的juc包下面的executor接口

StandardThreadExecutor属性

standardThreadExecutor是实现类,如图它也继承了生命周期相关的接口,受tomcat的生命周期管理。
在这里插入图片描述

public class StandardThreadExecutor extends LifecycleMBeanBase
        implements Executor, ResizableExecutor {
   
   

    protected static final StringManager sm = StringManager.getManager(StandardThreadExecutor.class);
    protected int threadPriority = Thread.NORM_PRIORITY;
    //默认守护线程,主线退出后,会自动退出,不会有残余
    protected boolean daemon = true;

     //线程名字的前缀
    protected String namePrefix = "tomcat-exec-";
    //默认最大线程200
    protected int maxThreads = 200;
    //(int)最小线程数(空闲和活动)始终保持活动状态,默认为 25
    protected int minSpareThreads = 25;
    //最长活跃时间 60秒
    protected int maxIdleTime = 60000;
     //注意这里的ThreadPoolExecutor 是tomcat实现的线程池,不是juc包下的
    protected ThreadPoolExecutor executor = null;
     //线程名称
    protected String name;
    protected boolean prestartminSpareThreads = false;
    //最大的队列大小
    protected int maxQueueSize = Integer.MAX_VALUE;
//(long)如果配置了ThreadLocalLeakPreventionListener,它将通知此执行程序有关已停止的上下文。上下文停止后,池中的线程将被更新。为避免同时更新所有线程,此选项在任意2个线程的续订之间设置延迟。该值以ms为单位,默认值为1000ms。如果值为负,则不会续订线程。 ¶ Lifecycle模板方法
    protected long threadRenewalDelay =
        org.apache.tomcat.util.threads.Constants.DEFAULT_THREAD_RENEWAL_DELAY;
// 任务队列
private TaskQueue taskqueue = null;

我们看下这个组件启动的方法,生命周期的startInternal()方法

 @Override
    protected void startInternal() throws LifecycleException {
   
   
       //自己实现的任务队列,后面讲下
        taskqueue = new TaskQueue(maxQueueSize);
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值