前提
Tomcat 10.1.x
Tomcat线程池介绍
Tomcat线程池,源于JAVA JDK自带线程池。由于JAVA JDK线程池策略,比较适合处理 CPU 密集型任务,但是对于 I/O 密集型任务,如数据库查询,rpc 请求调用等,不是很友好,所以Tomcat在其基础上进行了扩展。
任务处理流程
扩展线程池相关源码简析
Tomcat中定义了一个StandardThreadExecutor
类,该类实现了org.apache.catalina.Executor
,org.apache.tomcat.util.threads.ResizableExecutor
接口
该类内部定义了namePrefix
(创建的线程名称前缀,默认值tomcat-exec-
),maxThreads
(最大线程数,默认值 200),minSpareThreads
(最小线程数,即核心线程数,默认值 25),maxIdleTime
(线程最大空闲时间,毫秒为单位,默认值60秒),maxQueueSize
(最大队列大小,默认值 Integer.MAX_VALUE
)等属性,此外,还定义了一个org.apache.tomcat.util.threads.ThreadPoolExecutor
类型的执行器对象,一个execute(Runnable command)
方法
当execute(Runnable command)
方法被调用时,会调用上述ThreadPoolExecutor
类对象的execute
方法
org.apache.catalina.core.StandardThreadExecutor.java
import org.apache.catalina.Executor;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.LifecycleState;
import org.apache.catalina.util.LifecycleMBeanBase;
import org.apache.tomcat.util.res.StringManager;
import org.apache.tomcat.util.threads.ResizableExecutor;
import org.apache.tomcat.util.threads.TaskQueue;
import org.apache.tomcat.util.threads.TaskThreadFactory;
import org.apache.tomcat.util.threads.ThreadPoolExecutor;
public class StandardThreadExecutor extends LifecycleMBeanBase
implements Executor, ResizableExecutor {
protected static final StringManager sm = StringManager.getManager(StandardThreadExecutor.class);
// ---------------------------------------------- Properties
/**
* Default thread priority
*/
protected int threadPriority = Thread.NORM_PRIORITY;
/**
* Run threads in daemon or non-daemon state
*/
protected boolean daemon = true;
/**
* Default name prefix for the thread name
*/
protected String namePrefix = "tomcat-exec-";
/**
* max number of threads
*/
protected int maxThreads = 200;
/**
* min number of threads
*/
protected int minSpareThreads = 25;
/**
* idle time in milliseconds
*/
protected int maxIdleTime = 60000;
/**
* The executor we use for this component
*/
protected ThreadPoolExecutor executor = null;
/**
* the name of this thread pool
*/
protected String name;
/**
* The maximum number of elements that can queue up before we reject them
*/
protected int maxQueueSize = Integer.MAX_VALUE;
/**
* After a context is stopped, threads in the pool are renewed. To avoid
* renewing all threads at the same time, this delay is observed between 2
* threads being renewed.
*/
protected long threadRenewalDelay =
org.apache.tomcat.util.threads.Constants.DEFAULT_THREAD_RENEWAL_DELAY;
private TaskQueue taskqueue = null;
// ---------------------------------------------- Constructors
public StandardThreadExecutor() {
//empty constructor for the digester
}
//....此处代码已省略
@Override
public void execute(Runnable command) {
if (executor != null) {
// Note any RejectedExecutionException due to the use of TaskQueue
// will be handled by the o.a.t.u.threads.ThreadPoolExecutor
executor.execute(command);
} else {
throw new IllegalStateException(sm.getString("standardThreadExecutor.notStarted"));
}
}
//....此处代码已省略
}
当org.apache.tomcat.util.threads.ThreadPoolExecuto
类对象的execute(Runnable command)
方法被调用时,会调用该类定义的一个executeInternal
方法,并在捕获到RejectedExecutionException
异常时,尝试再次将任务放入工作队列中。
executeInternal
方法中,通过代码可知,