You created a pool of 10 threads. The ExecutorService
will create as they are needed and queue the tasks. The threads wait until a task is available (or ready to be executed), one of them gets notified and executes it. The behavior you are seeing seems to indicate that it is implemented in a way that it will create the 10 threads for the first 10 tasks and then re-use them.
I don't know what problem you want to solve.