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

Reply via email to