结论:同一个 ThreadLocal 变量不能在子线程中获取到,而 InheritableThreadLocal 变量中的值可以在父子线程之间传递。

例子:

public class Main {

    private static ThreadLocal<String> threadLocal = new ThreadLocal<>();
    private static InheritableThreadLocal<String> inheritableThreadLocal = new InheritableThreadLocal<>();

    public static void main(String[] args) {
        threadLocal.set("mainThread");
        inheritableThreadLocal.set("hello");

        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("threadLocal: " + threadLocal.get());    // null
                System.out.println("inheritableThreadLocal: " + inheritableThreadLocal.get());  // hello
            }
        });
        thread.start();
    }
}

输出:

threadLocal: null
inheritableThreadLocal: hello