ThreadLocal 线程之间是隔绝的,各自的ThreadLocal会给自己建一个副本缓存,只存自己都东西。所以想在一个线程中获取另一个线程的东西必须用InheritableThreadLocal
public static void main(String[] args) {
Thread threadParent = new Thread(()->{
ThreadLocal<String> localParent = new ThreadLocal<>();
localParent.set("3");
InheritableThreadLocal<String> threadLocal = new InheritableThreadLocal<>();
threadLocal.set("2");
new Thread(()->{
System.out.println("父ThreadLocal在子线程中获取,通过父线程类获取父线程的东西值"+localParent.get());
System.out.println("父InheritableThreadLocal在子线程中获取,通过父线程类获取父线程的东西"+threadLocal.get());
}).start();
});
threadParent.start();
}
输出:
父ThreadLocal在子线程中获取,通过父线程类获取父线程的东西值null
父InheritableThreadLocal在子线程中获取,通过父线程类获取父线程的东西值2
从这里可以看出,在子线程中直接用父线程的ThreadLocal对象获取父线程的ThreadLocal值不可能获取到,所以可以在父线程中利用InheritableThreadLocal赋值,然后在子线程中用父线程的InheritableThreadLocal对象获取父线程的值