M22a) core threads all busy
M22) start queuing
M33a) queue full
M33) create first thread beyond core threads
M44) 1st rejected task
As shown above, task queue has a max size; thread pool has a core size and max size.
P194 [[Java threads]] has a good illustration of these milestones in a “bounded pool” i.e. a pool with bounded queue. Here’s my modified version based on P194
* Pool starts with no thread no task
* First task -> create first thread
* tasks come in a flurry -> M22
* Queue full -> M33
* Pool capacity reached -> M44
How about an unbounded pool? M33 never happens.