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便起不到作用。