All,
> -----Original Message----- > From: Christopher Schultz <ch...@christopherschultz.net> > Sent: Tuesday, March 12, 2024 8:31 AM > To: users@tomcat.apache.org > Subject: Re: When does Tomcat add and remove threads? > > John, > > On 3/11/24 18:14, john.e.gr...@wellsfargo.com.INVALID wrote: > > From: Christopher Schultz <ch...@christopherschultz.net> > > Sent: Monday, March 11, 2024 5:09 PM > > > >> On 3/11/24 17:47, john.e.gr...@wellsfargo.com.INVALID wrote: > >>> I am using Tomcat 9.x. > >>> > >>> When does Tomcat add and remove threads from its internal thread > >>> pool? I'm talking about the threads with names like > >>> http-nio-8080-exec-1. It appears the thread pool is Tomcat's own > >>> ThreadPoolExecutor but I don't see the exact behavior documented. > >>> I'm familiar with how java.util.concurrent does it, but it looks > >>> like Tomcat's version is a little different. > >> > >> Are you looking for a technical explanation with code references, or > >> a plain-English description of when threads are created and added? > > > Mostly plain English like the j.u.c. ThreadPoolExecutor Java doc has. > > What happens when all core threads are in use? When do tasks go on > > the queue? When does core thread + 1 get added? When do threads get > > removed? > Tomcat will create thread pools under two separate circumstances. They are > related, but behave somewhat differently. > > First, if you declare an <Executor> in your server.xml, then a thread pool > will be > created. You can control the number of threads and their retention policy such > as "keep X spare threads around" and "retire threads after N seconds without > being used." > > Second, if you declare a <Connector> without specifying an "executor", a > thread pool will be configured for you but you don't really have control over > it > because all those nice configuration options for an <Executor> are not > available > on the <Connector>. If you want to control those settings, use a <Connector> > linked with an <Executor>. To be clear, if you declare a <Connector> without > an > "executor" attribute, your thread pool will be of a fixed size and threads > will > never be released. (I think the thread pool starts small and grows but will > never shrink.) > > An <Executor> is implemented in the StandardThreadExecutor and > ThreadPoolExecutor classes, which I believe were adaptations of classes from > java.util.concurrent introduced into Tomcat before java.util.concurrent was > actually available -- which is why it wasn't used directly in Tomcat. (NB: The > ThreadPoolExecutor class in Tomcat contains an "@author Doug Lea" tag. The > Tomcat source is licensed under AL2, the JDK source is licensed under GPL2, > but the original was released by Doug Lea into the public domain under a CC0 > 1.0 Deed license.) > > The re-sizing occurs in the ThreadPoolExecutor class if you'd like to read > it. It is > not entirely straightforward. You could start by reading the code for the > runWorker(Worker w) method where, at the end, processWorkerExit is called. > > But since Tomcat's ThreadPoolExecutor is basically Java's ThreadPoolExecutor, > they work the same. > > -chris > > --------------------------------------------------------------------- > To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org > For additional commands, e-mail: users-h...@tomcat.apache.org I took matters in to my own hands and wrote a test to see what was happening. Unlike java.util.concurrent.ThreadPoolExecutor, Tomcat's TPE adds threads when all core threads are busy. It only adds tasks to the queue when max threads are busy. I prefer this behavior to the JDK behavior. Threads are removed when idle for 60 seconds. This appears to be hard-coded in AbstreactEndpoint.createExecutor(). Thanks