Если вы проверите реализацию метода execute
в классе ExecutorService
, вы увидите следующий код:
//...................
if (isRunning(c) && workQueue.offer(command)) {
//...................
}
else if (!addWorker(command, false))
reject(command);
//...................
Таким образом, новый поток будет создан, только если workQueue
заполнен. Вы инициализировали свой пул с new ArrayBlockingQueue<>(10)
. Это означает, что новые потоки не будут созданы для первых 15 одновременных запросов (corePoolSize + емкость очереди).
Чтобы увидеть, например, 6 потоков, просто попробуйте запустить ab -n 1000 -c 16 http://localhost:8080/
или уменьшить начальную емкость очереди. Но учтите, что когда очередь заполнена и число потоков равно maximumPullSize
, любой новый запрос будет отклонен.