Weitere aktuelle Java-Titel finden Sie bei dpunkt.
 Inhaltsverzeichnis   Auf Ebene Zurück   Seite Zurück   Seite Vor   Auf Ebene Vor   Eine Ebene höher   Index


11.9

Thread-Groups


In Java gehört jeder Thread zu einer Gruppe. Thread-Gruppen werden durch die Klasse ThreadGroup repräsentiert. In einer ThreadGroup können Threads zusammengefasst werden, die von ihrer Aufgabe oder ihrer Zugehörigkeit her eine Einheit bilden. Wenn ein Thread nicht explizit einer bestimmten ThreadGroup zugeordnet wird, kommt er standardmäßig in die Gruppe von dem Thread, der ihn erzeugt. Ohne besondere Maßnahmen ist dies eine voreingestellte Gruppe, die automatisch von der Virtual Machine angelegt wird.

Bei Applikationen heißt diese Gruppe main, bei Applets legt der Browser für jedes Applet eine eigene Gruppe an, die den Namen der Applet-Klasse trägt.

Eine ThreadGroup kann sowohl Threads als auch wiederum andere ThreadGroups enthalten, wodurch insgesamt eine baumartige Struktur entsteht. In Analogie zu Daemon-Threads gibt es auch Daemon-Thread-Groups. Daemon-Thread-Groups werden automatisch entfernt, sobald der letzte enthaltene Thread beendet ist.

Abbildung 11.5: Hierarchische Struktur der Thread-Groups
Abbildung 11.5

Außer der Gruppe main besitzt jede Gruppe eine andere ThreadGroup als Vorfahr. Dieser Vorfahr kann bei der Erzeugung einer neuen ThreadGroup angegeben werden.

Die hierarchische Struktur der ThreadGroups kann in der Klasse SecurityManager verwendet werden, um Zugriffsrechte zuzuteilen. Sie wird ausführlich im Kapitel 15 behandelt.

Prinzipiell besteht das Problem, dass sich alle Threads bezüglich des Ausführungstatus oder der Priorität gegenseitig manipulieren können. Ein besonders eigenwilliger Thread könnte also die Ausführung aller konkurrierenden Threads durch Herabsetzen von deren Priorität aussetzen, um »alleine« über die CPU verfügen zu können.

Um diesen Missstand bei Applets, die in diesem Zusammenhang besonders kritisch sind, zu beseitigen, nutzt der SecurityManager von Applets die Struktur der Thread-Gruppen, um die gegenseitigen Zugriffsrechte von Threads hierarchisch zu organisieren.

Für den SecurityManager von Applets gilt folgende Grundregel: Ein Thread darf nur auf Threads seiner Gruppe sowie auf die Threads aller Untergruppen zugreifen. Der Zugriff auf Threads, die übergeordneten Gruppen zugeteilt sind, ist stets verwehrt. Falls ein Thread dennoch versucht, auf einen Thread einer übergeordneten Gruppe zuzugreifen, wird eine SecurityException ausgelöst.

Für jedes Applet legt der Browser eine eigene Thread-Gruppe an, die unter der Hauptgruppe steht, in der die System-Threads laufen. Durch die hierarchische Zugriffsstruktur wird verhindert, dass ein Applet den Ablauf von System-Threads beeinträchtigt oder Threads von anderen Applets manipulieren kann.

Von dieser Kontrolle sind bei Applets folgende Methoden betroffen: Bei Applikationen liegt der Fall dagegen anders. Sie haben standardmäßig keinen SecurityManager, damit unter anderem auch Dateizugriffe möglich sind. Somit gibt es auch bezüglich der gegenseitigen Zugriffe von Threads bei Applikationen keinerlei Einschränkungen, auch wenn auf einen Thread einer übergeordneten Gruppe zugegriffen wird.

Das folgende Programm demonstriert diesen Sachverhalt, in dem es versucht, die Priorität eines System-Threads herabzusetzen. Hierzu ermittelt es eine Referenz auf die Gruppe der System-Threads und versucht dann, die Priorität des »erstbesten« Threads aus dieser Gruppe auf den Minimalwert zu setzen:
  static void lowerSystemPrio() {
    ThreadGroup thisGroup, systemGroup;

    thisGroup = Thread.currentThread().getThreadGroup();
    systemGroup = thisGroup.getParent();

    Thread systemThread[] = new Thread[1];
    systemGroup.enumerate(systemThread);

    systemThread[0].setPriority(Thread.MIN_PRIORITY);
  }

Als Applikation gestartet gelingt es, die Priorität der System-Threads zu herunterzusetzen. Wenn das Programm dagegen über HTTP geladen und im Appletviewer gestartet wird, wird sofort eine SecurityException beim setPriority()-Aufruf ausgelöst.

Material zum Beispiel


 Inhaltsverzeichnis   Auf Ebene Zurück   Seite Zurück   Seite Vor   Auf Ebene Vor   Eine Ebene höher   Index

Copyright © 2002 dpunkt.Verlag, Heidelberg. Alle Rechte vorbehalten.