Да, ваше понимание верно, если вы посмотрите на реализацию Executors.newFixedThreadPool()
, она возвращает экземпляр ThreadPoolExecutor
с неограниченным BlockingQueue
реализацией:
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
LinkedBlockingQueue
- необязательно ограниченная реализация BlockingQueue
, в которой вы можете игнорировать аргумент емкости своего конструктора, если вы ничего не указали, максимальный размер очереди равен Integer.MAX_VALUE
:
public LinkedBlockingQueue() {
this(Integer.MAX_VALUE);
}
Таким образом, в отношении вашего вопроса все задачи будут отправлены в пул потоков , и одновременно будут выполняться только 10 потоков, которые будут вызывать API, а остальные будут поставлены в очередь.
В отличие от этого, если вы используете пользовательский ThreadPoolExecutor
с ограниченной реализацией BlockingQueue
, такой как ArrayBlockingQueue
(с предопределенной емкостью), вместо LinkedBlockingQueue
в том случае, если все потоки заняты, а очередь заполнена и вы пытаетесь отправить другую задачу, задача будет отклонена .
В вашем коде executorService.submit
будет продолжать принимать новые задачи (до Integer.MAX_VALUE
задач), но только 10 потоков будут работать в данный момент времени.