For the benefit of other people new to this thread, you can only use ThreadlocalPool if the threads are backed by a pool. Spawning new / infinite threads will lead to new / infinite instances. (
The StrictMaxPool is designed to hold a maximum amount of instances. It does not care about concurrency or retention.
I think it should be possible to extend StrictMaxPool and set the strictMaxSize semaphore higher than the maxSize. e.g. strictMaxSize = 200, maxSize = 50. That should allow for 200 concurrent requests, while the pool will size down to 50 during low load.