直接上代码
public class MyThread {
public static void main(String[] args) {
new Thread(new T()).start();
while (true){}
}
static class T extends Thread{
@Override
public void run() {
// 可继承的父线程的ThreadLocal, 子类需要获取到改引用,才能使用
InheritableThreadLocal<Map> pInheritableThreadLocal = new InheritableThreadLocal<>();
Map<String,String> map = new HashMap<>();
map.put("a","a");
pInheritableThreadLocal.set(map);
new Thread(()->{
while (true){
beginSleep(2 * 1000);
// 子线程的 Map
InheritableThreadLocal<Map> sInheritableThreadLocal = new InheritableThreadLocal();
// 从父类的 Map拿数据。其实是子类自己的ThreadLocal
// 只不过 父类 和 子类 共享 父类的 Map,并且都可以改变其值
Map pMap = pInheritableThreadLocal.get();
// 从自己的Map拿数据
Map sMap = sInheritableThreadLocal.get();
// 拿到 父线程Map里的数据
System.out.println("pMap:" + pMap);
System.out.println("sMap:" + sMap);
}
},"sub-t").start();
beginSleep(7 * 1000);
map.put("b","b"); // 继续加值
System.gc();
}
}
static void beginSleep(long millis){
try {
Thread.sleep(millis);
}catch (Exception e){
}
}
}
为什么 子类 可以 跟父类 共享 父类的 InheritableThreadLocal 中的 数据?
其实很简单。
就是创建线程的时候的一段逻辑,这个逻辑就是从父类的 InheritableThreadLocal 获取到值 赋值给 子类的 InheritableThreadLocal。
if (inheritThreadLocals && parent.inheritableThreadLocals != null)
this.inheritableThreadLocals =
ThreadLocal.createInheritedMap(parent.inheritableThreadLocals);