2010-07-16 4 views
23

Ich bin mir dessen bewusst derzeitige Praxis der Testamentsvollstrecker statt Thread mit:Warum ThreadGroup kritisiert wird?

  • allgemein bevorzugte Art und Weise mit Themen
  • Ausnahmen von Themen zu behandeln fangen, etc ...

Doch was sind die inhärenten Fehler der ThreadGroup als solche (ich habe eine vage Kritik für diese Klasse gehört)?

Danke für die Antwort.

PS. this scheint diese Frage nicht zu beantworten.

+6

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. –

+0

+1 für die Gründe, die Mark Peters angibt, und weil diese Frage ein gutes Vehikel ist, dies zu tun. –

+0

Warum ist dieses Community Wiki? –

Antwort

30

Dies erklärt sich in Effective Java 2nd Ed. Punkt 73.

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 ThreadsetUncaughtExceptionHandler 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).

+0

Danke für das Angebot. So verstehe ich richtig, dass wir in unserer Praxis ThreadGroup trotz der Tatsache, dass es immer noch innerhalb Thread-Methoden bleibt: start() und init (ThreadGroup g, lauffähiges Ziel, String-Name, long stackSize), letzterer wird aus aufgerufen Thread() Konstruktor und baut immer ThreadGroup? – Max

+0

Danke für die Kennzeichnung CW und für die Ref. Endlich kaufte das Buch aber noch nicht so weit. Die "UncaughtException" -Funktionalität war eigentlich das letzte, worauf ich neugierig war. –

+0

@Max Allgemein verwendbarer Bibliothekscode sollte immer noch wissen, welche 'ThreadGroup' die theads erstellt. Für einige Zwecke müssen Sie sich damit noch befassen. –