Advanced Java Services | 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.
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
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.