Класс Threadlocal представляет собой локальную переменную потока. Размещая данные в Threadlocal, каждый поток может создать копию переменной. Это также может рассматриваться как еще один способ синхронизации потока. Создавая потоковую копию переменной для каждого потока, она позволяет избежать конфликтов, когда одновременные одновременные потоки читают и записывают один и тот же ресурс переменной одновременно.
Примеры следующие:
Импорт java.util.random; import java.util.concurrent.executorservice; import java.util.concurrent.executors; import java.util.concurrent.timeUnit; импорт com.sun.javafx.webkit.accessess; public class tradelocaltest {static class statible statible statible statible statible statibuitor statible statible statible statible statible statible statible Threadlocal <Integer> value = new Threadlocal <Integer> () {private random random = new random (); Защищенный синхронизированный целое число initiorValue () {return random.nextint (10000); }}; public static void Increment () {value.set (value.get () + 1); } public static int get () {return value.get (); }} Статический класс Accessester реализует Runnable {private Final Int Id; public Accessestan (int id) {this.id = id; } @Override public void run () {while (! Thread.currentThread (). IsErengrupted ()) {ThreadLocalVariableHolder.increment (); System.out.println (это); Thread.yield (); }} @Override public String toString () {return "#" + id + ":" + threadlocalVariable Holder.get (); }} public static void main (string [] args) {rececusterService executorService = executors.newcachedthreadpool (); for (int i = 0; i <5; i ++) {executionservice.execute (новый доступ (i)); } try {timeUnit.microseconds.sleep (1); } catch (прерванное искусство e) {e.printstacktrace (); } executorservice.shutdownnow (); }}Результаты работы:
#1: 9685#1: 9686#2: 138#2: 139#2: 140#2: 141#0: 5255. Полем
Из результатов бега мы видим, что каждый поток используется для его собственных локальных переменных, и каждое чтение и записи не мешает друг другу.
Threadlocal предоставляет три метода для работы, установки, получения и удаления.
В Android Threadlocal используется для создания отдельных объектов Looper для каждого потока.
открытый окончательный класс Looper {private Static Final String Tag = "looper"; // sthreadlocal.get () вернет NULL, если вы не позвонили PREPARE (). Статический окончательный поторок <looper> sthreadlocal = new Threadlocal <looper> (); private static void Prepare (boolean quitallowed) {if (sthreadlocal.get ()! = null) {бросить новое runtimeexception («только одна петля может быть создана на поток»); } sthreadlocal.set (new Looper (quitAllowed)); }. Полем Полем }Когда поток нуждается в своей собственной очереди и очереди сообщений, он вызывает looper.prepare (), который создаст объект Looper и Messagequeue, принадлежащие потоке для потока, и сохранить объект Looper в Threadlocal.