Die ThreadLocal -Klasse repräsentiert eine lokale Thread -Variable. Durch das Platzieren der Daten in ThreadLocal kann jeder Thread eine Kopie der Variablen erstellen. Es kann auch als eine andere Art der Threadsynchronisation angesehen werden. Durch das Erstellen einer Thread-lokalen Kopie einer Variablen für jeden Thread werden Konflikte vermieden, wenn gleichzeitige Threads gleichzeitig dieselbe variable Ressource lesen und schreiben.
Beispiele sind wie folgt:
import Java.util.random; Import Java.util.concurrent.executorService; Import Java.util.Concurrent ThreadLocal <GeNeger> value = new ThreadLocal <GeNeger> () {private randal randomy = new random (); geschützte synchronisierte Integer initialValue () {return random.nextint (10000); }}; public static void Increment () {value.set (value.get () + 1); } public static int get () {return value.get (); }} statischer Klasse Accessor implementiert runnable {private endgültige int id; öffentlicher Accessor (int id) {this.id = id; } @Override public void run () {while (! Thread.currentThread (). IsInterrupted ()) {threadLocalVariableHolfen.increment (); System.out.println (this); Thread.yield (); }} @Override public String toString () {return "#" + id + ":" + threadLocalVariableHolder.get (); }} public static void main (String [] args) {ExecutorService ExecutorService = Executors.NewCachedThreadpool (); für (int i = 0; i <5; i ++) {executeService.execute (neuer Accessor (i)); } try {TimeUnit.Microseconds.sleep (1); } catch (interruptedException e) {e.printstacktrace (); } ExecutorService.shutdownnow (); }}Auslaufergebnisse:
#1: 9685#1: 9686#2: 138#2: 139#2: 140#2: 141#0: 5255. .
Aus den laufenden Ergebnissen können wir erkennen, dass jeder Thread für seine eigenen lokalen Variablen verwendet wird, und jeder liest und schreibt sich nicht miteinander.
ThreadLocal bietet drei Methoden zum Betrieb, Setzen, Abnehmen und Entfernen.
In Android wird ThreadLocal verwendet, um separate Looper -Objekte für jeden Thread zu erstellen.
public Final Class Looper {private statische endgültige String -Tag = "Looper"; // sthreadlocal.get () kehrt Null zurück, es sei denn, Sie haben Prepe () angerufen. statische endgültige ThreadLocal <Looper> sthreadLocal = new ThreadLocal <Looper> (); private static void prepe (boolean quitallowed) {if (sthreadLocal.get ()! } sthreadLocal.set (neuer Looper (Quitallowed)); }. . . }Wenn ein Thread seine eigene Looper- und Nachrichtenwarteschlange benötigt, ruft er Looper.Prepare () auf, wodurch ein Looper -Objekt und ein Messagequeue erstellt werden, das zum Thread für den Thread gehört, und das Looper -Objekt in ThreadLocal speichern.