Fadengruppen wurden ursprünglich als Mechanismus zur Isolierung Applets für Sicherheitszwecke in Betracht gezogen. Sie haben dieses Versprechen nie wirklich erfüllt, und ihre Sicherheitsbedeutung ist soweit abgeflaut, dass sie nicht einmal in der Standardarbeit über das Java-Sicherheitsmodell [Gong03] erwähnt werden.
[...] In Ironischerweise der ThreadGroup
API schwach ist aus einem Thread Sicherheitsstandpunkt. Um eine Liste der aktiven Threads in einer Thread-Gruppe abzurufen, müssen Sie die enumerate
-Methode aufrufen, die als Parameter ein Array verwendet, das groß genug ist, um alle aktiven Threads zu speichern . Die Methode activeCount
gibt die Anzahl der aktiven Threads in einer Thread-Gruppe zurück, aber es gibt keine Garantie, dass diese Anzahl immer noch genau ist, sobald ein Array zugewiesen und an die enumerate
-Methode übergeben wurde. Wenn die Thread-Anzahl erhöht und das Array zu klein ist, ignoriert die enumerate
Methode automatisch alle Threads, für die im Array kein Platz ist.
Die API, die die Untergruppen einer Threadgruppe auflistet, ist ähnlich fehlerhaft. Während diese Probleme mit dem Hinzufügen neuer Methoden behoben werden konnten, haben sie nicht, weil es keinen wirklichen Bedarf gibt: Thread-Gruppen sind veraltet.
Prior 1,5 zu lösen, gab es ein kleines Stück Funktionalität, die nur mit den ThreadGroup
API zur Verfügung stand: die ThreadGroup.uncaughtException
Methode war die einzige Möglichkeit, die Kontrolle zu gewinnen, wenn ein Thread eine abgefangene Ausnahme geworfen. Diese Funktionalität ist zum Beispiel nützlich, um Stack-Traces direkt an ein spezifisches Protokoll der Anwendung zu richten. Ab Release 1.5 ist jedoch die gleiche Funktionalität verfügbar mit Thread
setUncaughtExceptionHandler
Methode.
Zusammenfassend bieten Thread-Gruppen nicht viel nützliche Funktionalität, und viel von der Funktionalität, die sie bieten, ist fehlerhaft. Thread-Gruppen werden am besten als ein erfolgloser Versuch angesehen, und Sie sollten einfach ihre Existenz ignorieren. Wenn Sie eine Klasse entwerfen, die sich mit logischen Gruppen von Threads befasst, sollten Sie wahrscheinlich Threadpool-Executoren verwenden (Element 68).
Argh Ich hasse es, wenn Leute sagen, "ThreadGroup nicht verwenden". Es ist so, als würde man sagen: "Benutze keine Threads". Ein Thread hat eine ThreadGroup, darum geht es nicht. Wenn Sie also kein Programm ohne Threads haben wollen, ** benutzen Sie ThreadGroups **. Ich stimme zu, wir brauchen eine Frage, um * wann, wie und warum * sie nicht zu verwenden. –
+1 für die Gründe, die Mark Peters angibt, und weil diese Frage ein gutes Vehikel ist, dies zu tun. –
Warum ist dieses Community Wiki? –