使用InheritableThreadLocal可以在子线程中取得父线程继承下来的值。
1.值继承
示例代码:
package InheritableThreadLocalTest;
import java.util.Date;
/**
* @Author LiBinquan
*/
public class InheritableThreadLocalExt extends InheritableThreadLocal{
@Override
protected Object initialValue() {
return new Date().getTime();
}
}
Tools对象:
package InheritableThreadLocalTest;
/**
* @Author LiBinquan
*/
public class Tools {
public static InheritableThreadLocalExt ext = new InheritableThreadLocalExt();
}
线程A:
package InheritableThreadLocalTest;
/**
* @Author LiBinquan
*/
public class ThreadA extends Thread{
@Override
public void run() {
try{
for (int i = 0; i < 10; i++) {
System.out.println("在线程A中取值:"+Tools.ext.get());
Thread.sleep(100);
}
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
运行类:
package InheritableThreadLocalTest;
/**
* @Author LiBinquan
*/
public class Run {
public static void main(String[] args) {
try{
for (int i = 0; i < 10; i++) {
System.out.println("mian 中取值:"+Tools.ext.get());
}
Thread.sleep(5000);
ThreadA a = new ThreadA();
a.start();
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
输出:
2.值继承再修改
如果在值继承的同时进一步处理。
修改类:
package InheritableThreadLocalTest;
import java.util.Date;
/**
* @Author LiBinquan
*/
public class InheritableThreadLocalExt extends InheritableThreadLocal{
@Override
protected Object initialValue() {
return new Date().getTime();
}
@Override
protected Object childValue(Object parentValue) {
return parentValue+" 子线程加的";
}
}
输出:
但在使用InheritableThreadLocal类需要注意一点的是,如果子线程在取得值的同时,主线程将InheritableThreadLocal中的值进行更改,那么子线程取到的值还是旧值。