Thread 클래스의 threadLocals
3495 단어 다중 스레드
ThreadLocal에서 사용하는 간단한 예:
package com.test;
public class TestNum {
// ① ThreadLocal initialValue() ,
private static ThreadLocal seqNum = new ThreadLocal() {
public Integer initialValue() {
return 0;
}
};
// ②
public int getNextNum() {
seqNum.set(seqNum.get() + 1);
return seqNum.get();
}
public static void main(String[] args) {
TestNum sn = new TestNum();
// ③ 3 sn,
TestClient t1 = new TestClient(sn);
TestClient t2 = new TestClient(sn);
TestClient t3 = new TestClient(sn);
t1.start();
t2.start();
t3.start();
}
private static class TestClient extends Thread {
private TestNum sn;
public TestClient(TestNum sn) {
this.sn = sn;
}
public void run() {
for (int i = 0; i < 3; i++) {
// ④ 3
System.out.println("thread[" + Thread.currentThread().getName() + "] --> sn["
+ sn.getNextNum() + "]");
}
}
}
}
일반적으로 ThreadLocal의 하위 클래스를 익명으로 정의하여 초기 변수 값을 제공합니다. 예를 들어 ① 참조.TestClient 스레드는 일련의 번호를 생성하고 ③에서 우리는 3개의 TestClient를 생성하여 같은 TestNum 실례를 공유한다.위 코드를 실행하여 콘솔에서 다음 결과를 출력합니다.
thread[Thread-0] --> sn[1]
thread[Thread-1] --> sn[1]
thread[Thread-2] --> sn[1]
thread[Thread-1] --> sn[2]
thread[Thread-0] --> sn[2]
thread[Thread-1] --> sn[3]
thread[Thread-2] --> sn[2]
thread[Thread-0] --> sn[3]
thread[Thread-2] --> sn[3]
출력의 결과 정보를 살펴보면 각 스레드에서 발생하는 번호는 모두 같은TestNum 실례를 공유하지만 서로 간섭하는 상황이 발생하지 않고 각자 독립된 시퀀스 번호를 생성하는 것을 알 수 있다. 이것은 우리가 ThreadLocal을 통해 모든 스레드에 단독 복사본을 제공했기 때문이다.
위의 예에서 자신의 클래스에서ThreadLocal을 정의한 경우 Thread를 직접 사용할 수 있습니까?currentThread().threadLocals?
threadLocals 변수가 Thread에 있을 때 패키지 접근 권한 때문에 같은 패키지 아래에서만 접근할 수 없습니다.
그러나 반사를 통해threadLocals의 내용을 얻을 수 있습니다. 참고:
http://stackoverflow.com/questions/2001353/java-list-thread-locals
threadLocals는 무엇에 쓰입니까?
여러 ThreadLocal 인스턴스가 스레드에 저장됩니다.
ThreadLocal은 먼저 현재 스레드 t를 통해threadLocals를 얻은 다음에 자신의this를 키로 삼아threadLocals에서 스레드 로컬에 저장된 관련 데이터를 얻는다
ThreadLocal에서 get 및 set 메서드는 다음과 같습니다.
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null)
return (T)e.value;
}
return setInitialValue();
}
여기서 getMap 방법은 다음과 같습니다.
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
총괄ThreadLocal 원리: ThreadLocal 대상은 라인 사유재산(데이터)의 매니저에 해당하고 라인의 사유재산(데이터)에 저장과 획득 기능을 제공한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Java 다중 스레드를 순차적으로 실행하는 몇 가지 방법 요약Java 다중 스레드를 순차적으로 실행하는 몇 가지 방법 요약 동료는 무심결에 이 문제를 제기하고 두 가지 방법을 직접 실천했다.물론 더 좋은 방법이 있을 거야. 방법 1 이런 방법은 비교적 흔히 볼 수 있는 해결 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.