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