Исполнители темы не заканчиваются - PullRequest
0 голосов
/ 06 июня 2011

Я использую метод Executors.newFixedThreadPool (100). Для выполнения одной команды требуется около 20 потоков. После выполнения команды 5-6 раз приложение перестает отвечать на запросы. Моя тема реализует Callable.

Я сомневаюсь, что поток не завершается после завершения. Я также вызвал shutdown () для завершения потока.

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

Ответы [ 4 ]

3 голосов
/ 06 июня 2011

Потоки не заканчиваются.Вот что происходит:

  • Все рабочие потоки ожидают входную очередь
  • Один поток извлекает элемент head из очереди
  • Он запускает Callable
  • Он помещает результат в очередь результатов
  • Он ожидает нового элемента во входной очереди

Таким образом, либо очередь результатов переполняется, либо ваша Callableне возвращайся.

1 голос
/ 06 июня 2011

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

Исполнитель позаботится о том, чтобы вынуть задачи из очереди и очистить их.поэтому ответ «нет» - это не «все еще в очереди»

Осторожно, используя 100 потоков - это смехотворно большое число.Попробуйте от 2 до 8 для типичной машины (все зависит от того, сколько времени уходит на ожидание других вещей, например, ввода / вывода - чем больше ЦП ограничивает ваши задачи, тем меньше потоков вы должны использовать.

1 голос
/ 06 июня 2011
  1. Даже после вызова get () поток все равно будет в очереди. Infact API гарантирует, что даже если поток умирает, он воссоздает тот, чтобы поддерживать «фиксированность» (фиксированное число потоков в вашем пуле)

  2. Обратите внимание, что если потоки в вашем пуле действительно выполняют какую-то задачу (кроме ожидания), вызов shutdown не прекратит поток. Так, например если ваши потоки в бесконечном цикле что-то делают, то вызывать shutdown бесполезно.

0 голосов
/ 06 июня 2011

Вызов shutdown () только останавливает пул потоков от принятия новых задач и позволяет завершить весь поток после выполнения всех задач.

Сколько ядер у вас есть?Если у вас 100 занятых потоков и, скажем, 4 ядра, то каждый поток получит только небольшое количество процессорного времени.

...