InheritableThreadLocal和线程池

nee*_*esh 10 java multithreading threadpool

我有一个问题,我真的不认为有解决方案,但无论如何我会在这里尝试.我的应用程序使用线程池,并且此池中的某些线程具有可继承的线程局部变量.我已经扩展了ThreadPoolExecutor类,以便在线程完成执行时基本清除线程局部变量(在afterExecute回调方法中).

我知道当你有一个InheritableThreadLocal变量时,在初始化线程时调用childValue()方法以从父线程获取ThreadLocal变量的值.但是,在我的情况下,下次使用该线程时(在使用一次之后),InheritableThreadLocal变量的值为null(因为它之前已在afterExecute中清除).有没有办法在beforeExecute中访问父线程的线程局部变量,这样我就可以基本上模拟在创建线程时InheritableThreadLocal中的childValue方法.

Ste*_*n C 5

听起来这对于线程本地的"可继承"风格来说是一个糟糕的用例.

我的建议是只使用常规TheadLocal并明确地进行初始化; 例如,将父线程中的初始值作为参数或其他内容传递给子线程.

(我建议你强制初始化线程本地的子线程,让它一旦启动就获取它.但是这会冒一个竞争条件;例如,如果父线程在子进程之前被返回到池中线程开始执行.)


我想我要问的是,是否有办法从子线程访问父线程的线程局部变量的值.

没有办法做到这一点.

而且,从你的其他评论来看,我怀疑你的意思是"父母"和"孩子"在正常意义上...父线程创建子线程.

但这是一个想法.而不是尝试在线程之间共享变量,共享固定值(例如,请求ID),并将其用作共享的密钥Map.使用Map条目作为共享变量.