ThreadLocal 클래스는 스레드 로컬 변수를 나타냅니다. 데이터를 ThreadLocal에 배치함으로써 각 스레드는 변수의 사본을 생성 할 수 있습니다. 또한 스레드 동기화의 다른 방법으로 간주 될 수 있습니다. 각 스레드마다 변수의 스레드-로컬 사본을 만들면 동시 스레드가 동시에 동일한 변수 리소스를 읽고 쓸 때 충돌을 피합니다.
예는 다음과 같습니다.
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 classer {public strandlocaltest {import com.sun com.sun com.sun com.sun. ThreadLocal <integer> value = new ThreadLocal <integer> () {private random = new random (); 보호 된 동기화 된 정수 초기 value () {return random.nextInt (10000); }}; public static void excrement () {value.set (value.get () + 1); } public static int get () {return value.get (); }} 정적 클래스 액세서리는 실행 가능한 {private final int id; 공개 액세서 (int id) {this.id = id; } @override public void run () {while (! ride.currentThread (). islerrupted ()) {ThreadLocalVariableholder.increment (); System.out.println (this); thread.yield (); }} @override public String toString () {return "#" + id + ":" + ThreadLocalVariableholder.get (); }} public static void main (string [] args) {executorService executorService = executor.newCachedThreadPool (); for (int i = 0; i <5; i ++) {executeService.execute (new Accessor (i)); } try {timeUnit.microseconds.sleep (1); } catch (InterruptedException e) {e.printstacktrace (); } executorService.shutdownNow (); }}실행 결과 :
#1 : 9685#1 : 9686#2 : 138#2 : 139#2 : 140#2 : 141#0 : 5255. .
실행 결과에서 각 스레드는 자체 로컬 변수에 사용되며 각각의 읽기 및 쓰기는 서로를 방해하지 않습니다.
ThreadLocal은 작동, 설정, 얻기 및 제거하는 세 가지 방법을 제공합니다.
Android에서 Threadlocal은 각 스레드에 대해 별도의 루퍼 객체를 만드는 데 사용됩니다.
공개 최종 클래스 루퍼 {private static final String tag = "루퍼"; // sthreadlocal.get ()는 repay () 호출하지 않으면 NULL을 반환합니다. 정적 최종 THREADLOCAL <LOOPER> STHREADLOCAL = NEW THREADLOCAL <LOOPER> (); Private STATIC VOID PRECT (BOOLEAN QUITALLED) {if (STHREADLOCAL.GET ()! = NULL) {THROIN NEW RUNTIMEEXCEPTION ( "스레드 당 하나의 루퍼 만 생성 될 수 있습니다"); } sthreadlocal.set (new looper (quitallowed)); }. . . }스레드에 자체 루퍼 및 메시지 큐가 필요한 경우 Looper.prepare ()를 호출하여 스레드의 스레드에 속하는 루퍼 객체와 Messageque를 생성하고 Looper Object를 ThreadLocal에 저장합니다.