InheritableThreadLocal的使用是在子线程继承父线程的值。
但是子线程并不能继承父线程修改后的值,如果在主线程中使用InheritableThreadLocal的set方法,修改后的值,子线程看不到。
如果使用childValue方法修改继承父线程的值,必须先在父线程中调用InheritableThreadLocal的get方法,再在子线程中调用InheritableThreadLocal的get方法,否则子线程的get方法只能获得父线程的值,而不是childValue方法中修改的值。。。
class InheritableThreadLocalEx extends InheritableThreadLocal{
@Override
protected String initialValue() {
return “”+new Date().getTime();
}
@Override
protected String childValue(String parentValue) {
System.out.println("dfsfasdfasdfs");
return parentValue+":子";
}
}
public class Test extends Thread {
private static InheritableThreadLocalEx ex = new InheritableThreadLocalEx();
public Test(String name) {
super(name);
}
@Override
public void run() {
super.run();
while (true) {
System.out.printf("%s 从 InheritableThreadLocal 取数据:%s\n", Thread.currentThread().getName(),
ex.get());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws InterruptedException {
System.out.printf("%s 从 InheritableThreadLocal 取数据:%s\n", Thread.currentThread().getName(),
ex.get());
Test t1 = new Test("Child1");
t1.start();
Thread.sleep(1000);
ex.set("sdfefe");
while (true){
System.out.printf("%s 从 InheritableThreadLocal 取数据:%s\n", Thread.currentThread().getName(),
ex.get());
Thread.sleep(1000);
}
}
}