在对使用tomcat容器进行线程观察的时候,我们发现,如果我们的web应用正在运行,那么会有许多的catalina-exec线程,这些线程是真正执行springmvc应用中servlet的线程。那么catalina-exec线程来自哪里呢?
通过观察tomcat源码我们可以知道,在service组件内部,初始化的时候回预先建立一堆线程,线程的前缀名和大小数量可以在server.xml文件中进行配置,如下所示:
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="150" minSpareThreads="4" maxIdleTime="200"/>
service组件会根据这些配置建立线程池。这些线程会给service组件下的容器使用,在如context、wrapper等容器需要的时候,可以使用service组件预先建立的线程池,这就是为什么我们自己的servlet会使用catalina-exec线程的原因。