Java - управление размером пула потоков (в основном увеличивается) - PullRequest
2 голосов
/ 22 марта 2012

Я пытаюсь использовать пул потоков в Java. Но количество потоков неизвестно, поэтому я пытаюсь найти решение. Затем возникли два вопроса:

  1. Я некоторое время ищу возможности увеличения размера пула потоков, но пока не могу что-то придумать. Какие-нибудь предложения для этого? Некоторые говорят, что Executors.newCachedThreadPool() должно работать, но в определении метода говорится, что это для коротких потоков.

  2. Что если я установлю размер пула потоков как большое число, например, 50 или 100? Работает ли он нормально?

Ответы [ 2 ]

3 голосов
/ 22 марта 2012
  1. Вы можете использовать Executors.newCachedThreadPool и для более долгосрочных задач, но дело в том, что если у вас есть долго выполняющиеся задачи, и они добавляются постоянно и чаще, чем выполняются существующие задачиколичество потоков выйдет из-под контроля.В таком случае может быть лучше использовать пул потоков большего размера (большего размера) и позволить дальнейшим задачам ожидать очереди в свободном потоке.

  2. Это будет означать только то, что вы(вероятно) будет много живых потоков, которые спят (бездействуют) большую часть времени.В основном нужно учитывать следующие факторы:

    • Сколько потоков может обработать ваша система (т. Е. Сколько потоков может быть создано в общей сложности, в Windows-машинах это может быть меньше 1000, в Linuces вы можете получитьдесятки тысяч потоков и даже больше с некоторыми изменениями конфигурации системы)
    • Каждый поток потребляет по крайней мере размер стека одного потока с точки зрения памяти (в Linux это может быть что-то вроде 1-8MBдля каждого потока по умолчанию его снова можно настроить с помощью ulimits и -Xss -параметра JVM
    • По крайней мере с NPTL должно быть минимальное или почти нулевое наказание за переключение контекста для спящих потоков, поэтому лишние потоки«тяжелый» с точки зрения использования процессора

При этом, вероятно, было бы лучше использовать конструкторы ThreadPoolExecutor непосредственно дляполучите тот тип пула, который вы хотите.

2 голосов
/ 22 марта 2012

Executors.newCachedThreadPool() позволяет создавать темы по запросу. Я думаю, что вы можете начать использовать это - я не могу увидеть, где указано, что это для коротких потоков, но я держу пари, что причина в том, что вы повторно используете доступные потоки, наличие коротких потоков позволяет вам сохранить количество одновременных активных темы довольно низкие.

Если у вас не запущено слишком много потоков (вы можете проверить это с помощью JVisualVM или JConsole), я бы предложил придерживаться этого решения - особенно потому, что число ожидаемых потоков не определено. Затем проанализируйте виртуальную машину и соответственно настройте ваш пул.

Для вопроса 2 - вы имели в виду что-то вроде Executors.newFixedThreadPool(int)? Если да, помните, что если вы укажете количество потоков, которое вы определили при создании, ThreadPool заставит потоки ждать - вместо newCachedThreadPool, в котором новые потоки создаются динамически.

...