Почему ThreadGroup подвергается критике? - PullRequest
25 голосов
/ 16 июля 2010

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

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

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

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

PS. этот , кажется, не отвечает на этот вопрос.

1 Ответ

31 голосов
/ 16 июля 2010

Это объясняется в Effective Java 2nd Ed. , Item 73.

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

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

API, который перечисляет подгруппы группы потоков, аналогичнонедостатки.Хотя эти проблемы могли быть исправлены с помощью добавления новых методов, этого не произошло, поскольку в этом нет реальной необходимости: группы потоков устарели .

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

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

...