通过看 InheritableThreadLocal 的源码发现,InheritableThreadLocal 能读取到父线程值是通过在创建线程的时候赋值的:
if (inheritThreadLocals && parent.inheritableThreadLocals != null)
this.inheritableThreadLocals =
ThreadLocal.createInheritedMap(parent.inheritableThreadLocals);
而由于我们使用的是线程池,线程池是提前创建了一些线程放在线程池中,那么就导致我们在使用线程池里的线程的时候就拿不到父线程的值了。