Подтвердить что ты не робот

Почему ThreadGroup подвергается критике?

Мне известно о текущей практике использования Executors вместо ThreadGroup:

  • обычно предпочтительный способ работы с темами
  • ловить исключения из потоков и т.д.

Однако каковы присущие недостатки ThreadGroup как таковые (я слышал смутную критику для этого класса)?

Спасибо за ответ.

PS. this, похоже, не отвечает на этот вопрос.

4b9b3361

Ответ 1

Это объясняется в Эффективный Java 2nd Ed., Item 73.

Группы потоков первоначально предполагались как механизм для изоляции апплетов в целях безопасности. Они никогда не выполняли этот обещание, а их важность в области безопасности ослабевает в той степени, в которой они не имеют даже упоминается в стандартной работе над моделью безопасности Java [Gong03].

[...] В ироническом твисте API ThreadGroup слабый от безопасности потока точка зрения. Чтобы получить список активных потоков в группе потоков, вы должны вызывать метод enumerate, который принимает в качестве параметра массив, достаточно большой для удержания все активные потоки. Метод activeCount возвращает число активных потоки в группе потоков, но нет никакой гарантии, что этот счет будет по-прежнему точно после того, как массив был выделен и передан методу enumerate. Если количество потоков увеличилось, а массив слишком мал, метод enumerateтихо игнорирует любые потоки, для которых в массиве нет места.

API, который перечисляет подгруппы группы потоков, также имеет недостатки. В то время как эти проблемы могли быть исправлены с добавлением новых методов, они havent, потому что нет реальной необходимости: группы потоков устарели.

До выпуска 1.5 был доступен один небольшой функциональный блок только с API ThreadGroup: ThreadGroup.uncaughtExceptionметод был единственным способом получить контроль, когда нить бросила неперехваченное исключение. Эта функциональность полезна, например, для прямой трассировки стека в приложение- конкретный журнал. Однако, начиная с версии 1.5, доступны те же функциональные возможности с помощью метода Thread s setUncaughtExceptionHandler.

Подводя итог, группы потоков не обеспечивают много полезной функциональности, и большая часть функциональности, которую они предоставляют, является ошибочной. Группы тем лучше всего рассматривать как неудачный эксперимент, и вы должны просто игнорировать их существование. Если вы создаете класс, который имеет дело с логическими группами потоков, вы должен, вероятно, использовать исполнителей пула потоков (пункт 68).