2010-07-16 2 views
23

Я в курсе текущей практики использования Executors вместо ThreadGroup:Почему ThreadGroup подвергается критике?

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

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

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

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

+6

Argh Я ненавижу это, когда люди говорят «не используйте ThreadGroup». Это как сказать «не использовать потоки». В потоке есть ThreadGroup, этого не обойти, поэтому, если вы не хотите иметь программу без потоков, ** вы используете ThreadGroups **. Я согласен, что нам нужно задать вопрос, когда, как и почему * не использовать их. –

+0

+1 по причинам, которые указывает Марк Петерс, и потому что этот вопрос является хорошим средством для этого. –

+0

Почему это сообщество Wiki? –

ответ

30

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

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

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

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

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

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

+0

Спасибо за цитату. Итак, правильно ли я понимаю, что в нашей практике мы полностью избегаем ThreadGroup, несмотря на то, что она по-прежнему остается внутри методов Thread: start() и init (ThreadGroup g, Runnable target, String name, long stackSize), последний вызывается из Thread() и всегда строит ThreadGroup? – Max

+0

Спасибо за маркировку CW и для ссылки. Наконец купил книгу, но пока еще не получил. Функцией 'uncaughtException' был фактически последний бит, который мне было интересно. –

+0

@Max Универсальный библиотечный код должен все равно знать, какой 'ThreadGroup' он создает theads in. Поэтому для некоторых целей вам все равно придется иметь дело с ним. –