public class Test1 extends InheritableThreadLocal{
@Override
protected Object initialValue() {
return Thread.currentThread().getName()+"--默认值";
}
@Override
protected Object childValue(Object parentValue) {
return "("+parentValue+")--childvalue("+Thread.currentThread().getName()+")";
}
public static void main(String[] args) {
Test1 test1 = new Test1();
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
test1.set("T2--run");
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
test1.set("hhhhh");
System.out.println(Thread.currentThread().getName()+"--"+test1.get());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
},"T3").start();
}
},"T2");
t2.start();
}
}
test1.get()获取值得优先级顺序:
子线程T3自己set了值(可以是null)时,T3中get()获取的是自己set的值 -->
子线程没有set值时,子线程T3中get()获取的值为Test1类重写后的childValue()方法返回的值-->
如果Test1类没有重写childValue()方法,T3中get()获取的为父线程中set的值-->
如果父线程也没有set值,则获取Test1类中的initialValue方法返回值(没重写该方法则默认返回null)
网友评论