我有一个我真的认为没有解决方案的问题,但是我还是会在这里尝试。我的应用程序使用线程池,并且该池中的某些线程具有可继承的线程局部变量。我扩展了ThreadPoolExecutor类,以在执行完线程后实质上清除线程局部变量(在afterExecute回调方法中)。

我了解,当您拥有InheritableThreadLocal变量时,将在初始化线程以从父线程获取ThreadLocal变量的值时调用childValue()方法。但是,在我的情况下,下一次使用该线程(使用一次之后),InheritableThreadLocal变量的值为null(因为先前已在afterExecute中将其清除)。有没有一种方法可以在beforeExecute中访问父线程的线程局部变量,这样我就可以在创建线程时模拟InheritableThreadLocal中的childValue方法。

最佳答案

听起来这是线程本地的“可继承”风格的一个糟糕用例。

我的建议是只使用常规的TheadLocal并显式地进行初始化。例如将初始值从父线程传递给子线程作为参数或其他内容。

(我建议您通过让子线程在启动时立即获取值来强制线程本地子线程的初始化。但这会带来竞争条件;例如,如果父线程在子线程之前返回到池中,线程开始执行。)



没有办法做到这一点。

而且,从您的其他评论来看,我怀疑您的意思是正常意义上的“父”和“子”……父线程创建子线程。

但这是一个主意。与其尝试在线程之间共享变量,不如共享一个固定值(例如请求ID),并将其用作共享Map的键。使用Map条目作为共享变量。

关于java - InheritableThreadLocal和线程池,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7296623/

10-10 17:32