Я использую 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);