Java FixedThreadPool не работает с заданным размером пула?

Я использую FixedThreadPool для рабочих потоков. Вот как я его создал:

ThreadPoolExecutor producerThreadPool = (ThreadPoolExecutor) Executors.newFixedThreadPool(25);

Поэтому я установил его размер как 25, я предполагаю, что в любое время должно быть не более 25 активных потоков? (поправьте меня если я ошибаюсь).

Затем мой основной поток постоянно пытается отправить 30 рабочих потоков за раз, если в пуле потоков есть простаивающие потоки:

if(producerThreadPool.getActiveCount() <= 25)

но когда я отлаживаю его, я получаю этот журнал:

Mon Jul 23 14:04:42 EDT 2012: {"queued_count":"0","active_count":"28","scheduled_tasks":"28","core_pool_size":"1000","pool_size":"29"}
Mon Jul 23 14:04:43 EDT 2012: {"queued_count":"0","active_count":"3","scheduled_tasks":"33","core_pool_size":"1000","pool_size":"34"}
Mon Jul 23 14:04:44 EDT 2012: {"queued_count":"0","active_count":"0","scheduled_tasks":"60","core_pool_size":"1000","pool_size":"60"}
Mon Jul 23 14:04:45 EDT 2012: {"queued_count":"0","active_count":"0","scheduled_tasks":"90","core_pool_size":"1000","pool_size":"90"}
...

Очередь всегда пуста, core_pool_size по-прежнему равен 1000, а pool_size продолжает увеличиваться до 1000, но я предполагаю, что core_pool_size должен быть 25 и должны быть задачи в очереди?

Я сделал что-то не так или неправильно понял это?

Любая помощь будет оценена, спасибо!

Вот как я сгенерировал журнал:

HashMap<String, String> log = new HashMap<String, String>();
log.put("core_pool_size", Integer.toString(producerThreadPool.getCorePoolSize()));
log.put("scheduled_tasks", Long.toString(producerThreadPool.getTaskCount()));
log.put("pool_size", Integer.toString(producerThreadPool.getPoolSize()));
log.put("active_count", Integer.toString(producerThreadPool.getActiveCount()));
log.put("queued_count", Integer.toString(producerThreadPool.getQueue().size()));
String gson_str = gson.toJson(log);

person Yaxing    schedule 23.07.2012    source источник
comment
как генерируется это сообщение журнала?   -  person jtahlborn    schedule 23.07.2012
comment
Можете ли вы привести пример кода, который воспроизводит это?   -  person Peter Lawrey    schedule 23.07.2012
comment
Не могли бы вы предоставить SSCCE, воспроизводящий это, потому что, учитывая исходный код newFixedThreadPool и ThreadPoolExecutor, я не понимаю, как это возможно.   -  person JB Nizet    schedule 24.07.2012


Ответы (1)


Согласно документации ThreadPoolExecutor .getActiveCount() дает только приблизительное количество, что довольно справедливо, учитывая накладные расходы, необходимые для получения точного значения. Поэтому, когда вы видите «28», на самом деле это может быть не 28 одновременно работающих потоков, но за время вызова функции он насчитал 28 потоков.

person Jyro117    schedule 23.07.2012