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

Lokale Variablen


[1.2]Zur verbesserten Unterstützung von lokalen Variablen, die nur innerhalb eines Threads verfügbar sind, wurde in Version 1.2 die Klasse ThreadLocal eingeführt. Sie ist im Prinzip ein Behälter, der für jeden aus einer Klasse erzeugten Thread eine Kopie der Variablen enthält. Beim Abrufen oder Setzen des Werts ordnet sie dem aufrufenden Thread sein Exemplar der Variablen zu und führt die gewünschte Operation (get() oder set()) darauf aus. Beim ersten Zugriff auf die Variable wird sie mit der Methode initialValue() initialisiert.

ThreadLocal-Objekte zeichnen sich gegenüber »normalen« Datenelementen hauptsächlich durch zwei Merkmale aus: Aus dem zweiten Grund werden ThreadLocal-Datenelemente üblicherweise als private und zusätzlich oft auch als static vereinbart.

Bei der Verwendung von ThreadLocal-Variablen muss darauf geachtet werden, dass der Zugriff immer nur aus dem zugehörigen Thread erfolgen kann, da das entsprechende Exemplar der Variablen für andere Threads nicht ansprechbar ist. Daher muss man bei der Verwendung von ThreadLocal in einer Unterklasse von Thread beachten, dass die lokale Variable innerhalb des Konstruktors noch nicht verfügbar ist, da der Konstruktor von einem anderen Thread ausgeführt wird.

ThreadLocal ist intern mit einer Map realisiert, die die Exemplare der Variablen enthält. Beim Zugriff auf die Variable mit den Methoden set() und get() wird der aufrufende Thread zunächst mit der Methode Thread.currentThread() ermittelt und dann als Schlüssel für die Map verwendet. Mit dieser Realisierung wird gewährleistet, dass ein Thread immer nur sein spezielles Exemplar der Variablen präsentiert bekommt.

Variablen, die mit ThreadLocal realisiert sind, werden nicht an aus einem Thread erzeugte »Kind«-Threads weitergeben. Für Fälle, in denen diese Funktionalität benötigt wird, gibt es die Klasse InheritableThreadLocal.

Das folgende Beispiel zeigt die Verwendung von ThreadLocal bei einem Applet, das das Interface Runnable implementiert. Es soll drei Bilder gleichzeitig mit jeweils einem Thread berechnen. Da jeder Thread einen eigenen Puffer benötigt, wird er mit einem ThreadLocal-Datenelement definiert. Ein normales Datenelement könnte hierzu, wie zuvor gesagt, nicht verwendet werden.

Damit jeder Thread beim ersten Zugriff einen initialisierten Puffer zur Verfügung gestellt bekommt, wird die Methode initialValue() in einer anonymen Unterklasse entsprechend überschrieben. Standardmäßig liefert diese Methode null.
  public class RenderApplet extends Applet
                            implements Runnable {
  
    ...
    // Bei Initialisierung leeren Puffer erzeugen
    ThreadLocal imageBuffer = new ThreadLocal() {
      protected Object initialValue() {
        return new int[IMAGESIZE];
      }
    };
  
    public void run() {
  
      // Referenz auf Puffer holen
      int[] buffer = (int[])imageBuffer.get();
      ...
      // Bild berechnen und abliefern
      ...
    }
    ...
  }

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.