https://blog.csdn.net/weixin_47493863/article/details/136605583

在Java中,ThreadLocal变量是线程隔离的,即每个线程都有自己的ThreadLocal变量副本,一个线程设置的值对其他线程是不可见的。所以,通常情况下子线程无法直接获取父线程的ThreadLocal的值。

如果你需要在父线程和子线程之间共享ThreadLocal变量,你可以采用以下策略之一:

  1. 在子线程创建之前手动传递: 在创建子线程之前从父线程的ThreadLocal中取出相应的值,然后将这个值作为参数传递给子线程。这样子线程就可以使用从父线程传递来的值了。
  2. 使用InheritableThreadLocal: Java提供了一个InheritableThreadLocal类,它扩展了ThreadLocal,允许子线程可以访问在父线程中设置的初始值。但需要注意的是,一旦子线程访问或修改了这个值,之后父线程中该ThreadLocal值的更改将不会反映到子线程中,因为它们各自维护自己的副本。

使用InheritableThreadLocal,一个示例代码如下:

 public static void main(String[] args) {
        Thread parentThread = new Thread(() -> {
            ThreadLocal<Integer> threadLocal = new ThreadLocal<>();
            threadLocal.set(1);

            InheritableThreadLocal<Integer> integerInheritableThreadLocal = new InheritableThreadLocal<>();
            integerInheritableThreadLocal.set(2);

            new Thread(()->{
                System.out.println("threadLocal = " + threadLocal.get());
                System.out.println("integerInheritableThreadLocal = " + integerInheritableThreadLocal.get());
            }).start();
        },"parentThread");
        parentThread.start();
    }

使用InheritableThreadLocal时需要谨慎采用,因为它会有一些性能开销,并且在使用线程池时,子任务可能会继承到先前任务在父线程中设置的值,这可能会导致不可预见的数据共享问题。

如何在子线程拿到父线程threadLocal的值