Advanced   Java   Services ThreadLocal Back Next Up Home

ThreadLocal

Wie in Java seit der Version 1.2 gibt es auch in C# ab der Version 4.0 eine Klasse ThreadLocal mit praktisch identischen Eigenschaften. Ein ThreadLocalobjekt verwaltet einen Datenpool von Instanzen gleichen Typs, von denen jede genau einem Thread zugeordnet sind. Hierzu das folgende Beispiel.


Ein Beispiel

Wir legen ein Objekt vom Typ ThreadLocal mit dem generischen Typ String in main() an und geben dieses Objekt an zwei Threads weiter. Jeder Thread schreibt mit Hilfe der Property Value Daten in das Objekt und gibt die geschriebenen Daten zur Kontrolle auf die Konsole aus. Am Schluß gibt main() die seine Daten aus.

Die Klasse mit der Methode, die dem Thread übergeben wird.

class Task
{
   private string name;
   private ThreadLocal<String> threadLocalString;

   public Task(String name, ThreadLocal<String> threadLocalString)
   {
      this.threadLocalString = threadLocalString;
      this.name = name;
   }

   public void Run()
   {
      Console.WriteLine(name + " old value: " + threadLocalString.Value);
      threadLocalString.Value = name; //.set(Thread.currentThread().getName());
      Console.WriteLine(name + " new value: " + threadLocalString.Value);
   }
}

Main

private static void Main(string[] args)
{
   ThreadLocal<String> threadLocalString = new ThreadLocal<string>(() => "InitialValue");
   Task t1 = new Task("thread1", threadLocalString);
   Thread th1 = new Thread(t1.Run);
   Task t2 = new Task("thread2", threadLocalString);
   Thread th2 = new Thread(t2.Run);
   th1.Start();
   th2.Start();

   Console.WriteLine(threadLocalString.Value);
}

Drei Abläufe

csharp-threads-39.jpg

csharp-threads-40.jpg

csharp-threads-41.jpg


Erklärung

Greift ein Thread zum Erstenmal über Value auf ein ThreadLocalobjekt zu wird er registriert und der mit Valued gesetzte Wert wird in eine Variable geschrieben, die nur für diesen Thread zuständig ist und solange existiert, solange der Thread existiert. Auf diese Weise erhält jeder Thread der auf dieses ThreadLocalobjekt Zugriff sein eigenes Object vom vorher vereinbarten generischen Typ. In vorigen Beispiel verwaltet das ThreadLocalobjekt zwei Strings, einen für Task 1, einen für Task 2. Mit dem letzten Statement in Main greift der MainThread zum erstenmal auf das ThreadLocalobjekt zu. Da er aber keinen Wert setzt, liefert Value den anfänglich über den Konstruktor gesetzten Wert.







Valid XHTML 1.0 Strict top Back Next Up Home