tomcat中线程池的配置是哎server.xml中:
<Server port="8005" shutdown="SHUTDOWN">
<Service name="Catalina">
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="150" minSpareThreads="4"/>
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
</Service>
</Server>
具体可配置参数如下:
http://tomcat.apache.org/tomcat-7.0-doc/config/executor.html#Standard_Implementation
在tomcat启动的时候,会触发StandardService的 startInternal方法:
protected void startInternal() throws LifecycleException {
setState(LifecycleState.STARTING);
// Start our defined Container first
if (container != null) {
synchronized (container) {
container.start();
}
}
synchronized (executors) {
for (Executor executor: executors) {
executor.start();
}
}
// Start our defined Connectors second
synchronized (connectorsLock) {
for (Connector connector: connectors) {
try {
// If it has already failed, don't try and start it
if (connector.getState() != LifecycleState.FAILED) {
connector.start();
}
} catch (Exception e) {
log.error(sm.getString(
"standardService.connector.startFailed",
connector), e);
}
}
}
}
之后触发StandardThreadExecutor的startInternal方法:
@Override
protected void startInternal() throws LifecycleException {
taskqueue = new TaskQueue(maxQueueSize);
TaskThreadFactory tf = new TaskThreadFactory(namePrefix,daemon,getThreadPriority());
executor = new ThreadPoolExecutor(getMinSpareThreads(), getMaxThreads(), maxIdleTime, TimeUnit.MILLISECONDS,taskqueue, tf);
executor.setThreadRenewalDelay(threadRenewalDelay);
if (prestartminSpareThreads) {
executor.prestartAllCoreThreads();
}
taskqueue.setParent(executor);
setState(LifecycleState.STARTING);
}
此StandardThreadExecutor正是tomcat使用的线程池,类声明如下:
public class StandardThreadExecutor extends LifecycleMBeanBase
implements Executor, ResizableExecutor
此类内部持有了一个protected ThreadPoolExecutor executor
线程池,具体工作都是委托executor进行处理。
从上面可以看出,在new ThreadPoolExecutor时,会使用在server.xml中配置的参数,如核心线程数,最大线程数等。
另外,线程池的任务队列是一个TaskQueue,该类声明如下:
public class TaskQueue extends LinkedBlockingQueue<Runnable>
其实就是一个LinkedBlockingQueue,如果配置了maxQueueSize,那么就是有界队列,参数maxThreads就会有效,在有界队列满了之后,会继续创建大于核心线程数的线程;如果没有配置maxQueueSize,那么队列的长度默认为Integer.MAX_VALUE,理论上等价于无界队列,此时maxThreads便起不到作用。