La clase ThreadLocal representa una variable local de hilo. Al colocar los datos en ThreadLocal, cada hilo puede crear una copia de la variable. También se puede considerar como otra forma de sincronización de hilos. Al crear una copia local de hilo de una variable para cada hilo, evita conflictos cuando los hilos concurrentes leen y escriben el mismo recurso variable al mismo tiempo.
Los ejemplos son los siguientes:
import java.util.random; import java.util.concurrent.executorservice; import java.util.concurrent.executors; import java.util.concurrent.timeunit; import com.sun.javafx.webkit.accessor; public class threadlocalTest {static classthlocalvariable {private statatating {private statatating {private statatating {private statatation {private statatation {private statatating statating statatation ThreadLocal <Integer> value = new ThreadLocal <Integer> () {private Random Random = new Random (); Integer sincronizado protegido InitialValue () {return Random.NextInt (10000); }}; public static void increment () {value.set (value.get () + 1); } public static int get () {return value.get (); }} El accesor de clase estática implementa runnable {private final int id; Public accesor (int id) {this.id = id; } @Override public void run () {while (! Thread.CurrentThread (). IsInterrupted ()) {ThreadLocalVariableHolder.Increment (); System.out.println (esto); Thread.yield (); }} @Override public String toString () {return "#" + id + ":" + ThreadLocalVariableHolder.get (); }} public static void main (string [] args) {ExecutorService ExecutorService = Ejecutors.NewCachedThreadPool (); para (int i = 0; i <5; i ++) {ejecuteservice.execute (nuevo accesor (i)); } try {timeUnit.microseconds.sleep (1); } catch (InterruptedException e) {E.PrintStackTrace (); } EjecutorService.shutdownnow (); }}Resultados de ejecución:
#1: 9685#1: 9686#2: 138#2: 139#2: 140#2: 141#0: 5255 .. .
A partir de los resultados de la ejecución, podemos ver que cada hilo se usa para sus propias variables locales, y cada una lectura y escritura no interfiere entre sí.
ThreadLocal proporciona tres métodos para operar, establecer, obtener y eliminar.
En Android, ThreadLocal se usa para crear objetos Looper separados para cada hilo.
Public Final Class Looper {private static final String tag = "looper"; // sthreadlocal.get () devolverá nulo a menos que haya llamado a preparar (). Static Final ThreadLocal <Looper> SthreadLocal = new ThreadLocal <Looper> (); Private static void prepare (boolean quitallowed) {if (shhreadlocal.get ()! = null) {throw new runtimeException ("Solo se puede crear un looper por hilo"); } sthreadlocal.set (nuevo looper (salpicando)); }. . . }Cuando un hilo necesita su propia cola de looper y mensajes, llama a looper.prepare (), que creará un objeto Looper y un mensaje que pertenece al hilo para el hilo, y guardará el objeto Loooper en ThreadLocal.