Краткий ответ - нет, не совсем. Использование одного мало что дает.
Если немного расширить это, если вы хотите сгруппировать рабочие потоки вместе, то вам гораздо лучше использовать ExecutorService. Если вы хотите быстро подсчитать, сколько потоков в концептуальной группе живы, вам все равно нужно проверить каждый поток по отдельности (так как ThreadGroup.activeCount () является оценкой, то есть это не полезно, если правильность вашего кода зависит от его вывода) .
Я бы зашел так далеко, что сказал бы, что единственное, что вы получили бы от одного из них в наши дни, кроме семантической компартментализации, - это то, что потоки, созданные как часть группы, будут поднимать флаг демона и разумное имя на основе их группы. И используя это как ярлык для заполнения нескольких примитивов в вызове конструктора (который, как правило, вам в любом случае придется записать один раз, так что вы, вероятно, запускаете потоки в цикле и / или методе звоните).
Итак - я действительно не вижу никаких веских причин использовать его вообще. Я специально пытался, несколько месяцев назад, и потерпел неудачу.
EDIT - я предположим, одно потенциальное использование будет, если вы работаете с SecurityManager и хотите утверждать, что только потоки в одной группе могут прерывать друг друга. Даже это довольно гранично, так как реализация по умолчанию всегда возвращает true для потока в любой несистемной группе потоков. И если вы реализуете свой собственный SecurityManager, у вас есть возможность заставить его принимать решение по любым другим критериям (включая типичный метод хранения потоков в коллекциях по мере их создания).