Почему ThreadGroup критикуется?

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

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

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

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

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

25
задан 2 revs 23 May 2017 в 11:46
поделиться

1 ответ

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

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

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

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

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

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

32
ответ дан 28 November 2019 в 21:37
поделиться