Question Pourquoi ThreadGroup est-il critiqué?


Je suis conscient de la pratique actuelle consistant à utiliser des exécuteurs au lieu de ThreadGroup:

  • manière généralement préférée de traiter les threads
  • attraper les exceptions des threads, etc ...

Cependant, quels sont les éléments inhérents défauts de ThreadGroup en tant que tel (j'ai entendu une vague critique pour cette classe)?

Merci de répondre.

PS ce ne semble pas répondre à cette question.


24


origine


Réponses:


Ceci est expliqué dans Java efficace 2e éd., Article 73.

Les groupes de fils ont été initialement envisagés comme un mécanisme   pour isoler des applets à des fins de sécurité. Ils n'ont jamais vraiment rempli ce   promesse, et leur importance pour la sécurité a diminué dans la mesure où ils ne sont plus   même mentionné dans le travail standard sur le modèle de sécurité Java [Gong03].

[...] Dans une torsion ironique, le ThreadGroup L'API est faible d'une sécurité de thread   point de vue. Pour obtenir une liste des threads actifs dans un groupe de threads, vous devez appeler   la enumerate méthode, qui prend comme paramètre un tableau suffisamment grand pour contenir   tous les threads actifs. le activeCount méthode retourne le nombre de actif   threads dans un groupe de threads, mais il n'y a aucune garantie que ce compte sera toujours   précis une fois qu'un tableau a été alloué et passé à la enumerate méthode. Si   le nombre de threads a augmenté et le tableau est trop petit, le enumerate méthode   ignore silencieusement tous les threads pour lesquels il n'y a pas de place dans le tableau.

L'API qui répertorie les sous-groupes d'un groupe de threads est également erronée. Tandis que   ces problèmes auraient pu être résolus avec l’ajout de nouvelles méthodes, ils   n'a pas, car il n'y a pas de besoin réel: les groupes de threads sont obsolètes.

Avant la version 1.5, il y avait une petite fonctionnalité disponible   seulement avec le ThreadGroup API: le ThreadGroup.uncaughtException   La méthode était le seul moyen de prendre le contrôle lorsqu'un thread envoyait une exception non capturée.   Cette fonctionnalité est utile, par exemple, pour diriger des traces de pile vers une application.   journal spécifique. A partir de la version 1.5, cependant, la même fonctionnalité est disponible   avec Thread'S setUncaughtExceptionHandler méthode.

Pour résumer, les groupes de threads ne fournissent pas beaucoup de fonctionnalités utiles,   et une grande partie des fonctionnalités qu'ils fournissent est imparfaite. Groupes de fils   sont mieux vus comme une expérience infructueuse, et vous devriez simplement ignorer leur   existence. Si vous concevez une classe qui traite des groupes logiques de threads, vous   devrait probablement utiliser des exécuteurs de pool de threads (élément 68).


30