【发布时间】:2017-12-28 09:15:12
【问题描述】:
我想在 java 中测试 ThreadLocal 对象的用法,但似乎我的 initialValue() 不起作用。我实际上在set() 之前调用了get(),它应该返回变量ID,如预期的那样为100。这是我的代码:
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的用法?
【问题讨论】:
-
所有对象自动继承
Object,无需显式扩展(extends Object)
标签: java multithreading initialization thread-local