Означает ли это, что количество одновременно выполняющихся потоков в пуле потоков фиксированного размера всегда будет меньше, чем corePoolSize, если очередь не заполнена?
Нет.
Семантический подход
Насколько я читал, и для пулов фиксированного размера, эта цитата ничего не говорит о количестве активных потоков, конкретно относительно размера очереди. Единственное предложение, связывающее их, это одно:
Если запущено больше, чем corePoolSize, но меньше, чем maximumPoolSize потоков, новый поток будет создан только в том случае, если очередь заполнена.
Что не применяется, поскольку в пуле фиксированного размера corePoolSize
равно maximumPoolSize
. Условие «если» никогда не выполняется.
Однако в нем говорится:
Когда отправляется новая задача [...] и выполняется меньше потоков corePoolSize, создается новый поток для обработки запроса, даже если другие рабочие потоки простаивают.
Потоки будут создаваться до тех пор, пока не будет достигнут corePoolSize
предел. Пока этот предел не достигнут, потоки не будут использоваться повторно (но они могут умереть при неперехваченном исключении или из-за тайм-аута пула). Что явно оставляет место для создания corePoolSize
потоков, если мы создадим их достаточно быстро или у нас будет достаточно длинная очередь.
Экспериментальный подход
Эти знания позволяют нам представить следующий сценарий: создать фиксированный пул размером 2 с очередью ожидания размером 5, а затем отправить в пул две длительно выполняющиеся задачи. («Длительное выполнение» означает, что время выполнения каждой задачи на порядок больше, чем время, необходимое для основного потока, чтобы отправить их, и для пула потоков, чтобы подтвердить их присутствие и работать над ними). Возможный график для этого следующий:
- Основной поток отправляет задачу T1 в новый пустой пул.
- В силу приведенной выше цитаты,
corePoolSize
еще не достигнуто, создается новый поток для выполнения T1.
- Поток 1 начинает выполнение T1
- Основной поток отправляет T2
- Как и на шаге 2, создается второй поток, и пул достигает
corePoolSize
- Как и на шаге 3, второй поток начинает выполнение задачи T2.
На данный момент пул потоков имеет пустую очередь и количество работающих потоков ровно corePoolSize
, а не «меньше corePoolSize
», QED.
Что это значит:
Напротив, это означает, что единственный способ получить количество потоков больше corePoolSize
- это одновременное выполнение всех условий:
- количество запущенных потоков больше (или равно)
corePoolSize
, и
maximumPoolSize
больше, чем corePoolSize
, и
- полная очередь
person
GPI
schedule
24.02.2016
maximumPoolSize
потоки начали обрабатывать полную очередь, но новые задачи не поступают. По завершении задач вы достигнете точки, в которойcorePoolSize < numberOfThreadsRunning < maximumPoolSize
. - person bradimus   schedule 24.02.2016corePoolSize
, но меньшеmaximumPoolSize
потоков, еслиcorePoolSize
не меньшеmaximumPoolSize
? - person bradimus   schedule 24.02.2016corePoolSize
=maximumPoolSize
. - person Ksenia   schedule 24.02.2016