자바에서 ThreadLocal
개체의 사용을 테스트하고 싶지만 내 initialValue()가 작동하지 않는 것 같습니다. 그리고 정확히 get()
을 set()
전에 호출하면 예상대로 변수 ID
을 반환해야합니다.왜 ThreadLocal의 initialValue()가 작동하지 않습니까?
public class UsageThreadLocal implements Runnable {
private AnotherThreadID<Long> var;
public UsageThreadLocal(AnotherThreadID<Long> v) {
this.var = v;
}
public void run() {
try {
print("var getThreadID =" + var.get());
Thread.sleep(200);
var.set(Thread.currentThread().getId());
print("var getThreadID =" + var.get());
} catch (InterruptedException x) {
}
}
private static void print(String msg) {
String name = Thread.currentThread().getName();
System.out.println(name + ": " + msg);
}
public static void main(String[] args) {
AnotherThreadID<Long> tid = new AnotherThreadID<Long>() {
@Override
public Long initialValue() {
ID = new Long(100);
System.out.println("I'm in initialValue()!");
return ID;
}
};
UsageThreadLocal shared = new UsageThreadLocal(tid);
try {
Thread threadA = new Thread(shared, "threadA");
threadA.start();
Thread.sleep(50);
Thread threadB = new Thread(shared, "threadB");
threadB.start();
Thread.sleep(50);
Thread threadC = new Thread(shared, "threadC");
threadC.start();
} catch (InterruptedException x) {
}
}
}
class AnotherThreadID<T> extends ThreadLocal<T> {
public T ID;
@Override
public void set(T newID) {
ID = newID;
}
@Override
public T get() {
return ID;
}
}
내 코드의 결과를 실행 :
threadA: var getThreadID =null
threadB: var getThreadID =null
threadC: var getThreadID =null
threadA: var getThreadID =9
threadB: var getThreadID =10
threadC: var getThreadID =11
무엇 내 코드의 문제가 아니면 내가 ThreadLocal
의 사용을 오해를 여기에 내 코드?
모든 개체는 자동으로'개체'를 상속하고, 그것을 확장시키지 않아도됩니다 ('extends Object') –