Группы потоков изначально рассматривались как механизм изоляции апплетов в целях безопасности.Они так и не выполнили это обещание, и их важность для безопасности уменьшилась до такой степени, что они даже не упоминаются в стандартной работе над моделью безопасности Java [Gong03].
[...] По иронии судьбыТвист, API ThreadGroup
слаб с точки зрения безопасности потоков.Чтобы получить список активных потоков в группе потоков, вы должны вызвать метод enumerate
, который принимает в качестве параметра массив, достаточно большой, чтобы вместить все активные потоки.Метод activeCount
возвращает количество активных потоков в группе потоков, но нет никакой гарантии, что этот счет останется точным после того, как массив будет выделен и передан методу enumerate
.Если число потоков увеличилось, а массив слишком мал, метод enumerate
автоматически игнорирует все потоки, для которых нет места в массиве.
API, который перечисляет подгруппы группы потоков, аналогичнонедостатки.Хотя эти проблемы могли быть исправлены с помощью добавления новых методов, этого не произошло, поскольку в этом нет реальной необходимости: группы потоков устарели .
До выпуска 1.5 существовалоодна небольшая часть функциональности, которая была доступна только с ThreadGroup
API: метод ThreadGroup.uncaughtException
был единственным способом получить контроль, когда поток генерировал необработанное исключение.Эта функция полезна, например, для направления трассировки стека в журнал конкретного приложения.Однако, начиная с версии 1.5, та же функциональность доступна с методом Thread
setUncaughtExceptionHandler
.
Подводя итог, можно сказать, что группы потоков не предоставляют много полезных функций, а большая частьФункциональность, которую они предоставляют, несовершенна.Группы потоков лучше всего рассматривать как неудачный эксперимент, и вы должны просто игнорировать их существование.Если вы разрабатываете класс, который работает с логическими группами потоков, вам, вероятно, следует использовать исполнителей пула потоков (элемент 68).