如何从Java中的另一个线程访问ThreadLocal中的信息

如何从Java中的另一个线程访问ThreadLocal中的信息,java,multithreading,servlets,Java,Multithreading,Servlets,我正在使用Java web应用程序后端。我们有一个Servlet,在init()方法中 public static final ThreadLocal<HttpServletRequest> REQUEST_HOLDER = new ThreadLocal<HttpServletRequest>(); 然后,Servlet将REQUEST_HOLDER的值与请求一起设置 REQUEST_HOLDER.set(request); 稍后在servlet中,我想在另一个线程

我正在使用Java web应用程序后端。我们有一个Servlet,在init()方法中

public static final ThreadLocal<HttpServletRequest> REQUEST_HOLDER = new ThreadLocal<HttpServletRequest>();
然后,Servlet将REQUEST_HOLDER的值与请求一起设置

REQUEST_HOLDER.set(request);
稍后在servlet中,我想在另一个线程上执行一些繁重的处理,但仍然引用来自ThreadLocalRequest_持有者的请求,从技术上讲,该请求位于另一个线程上。这可能吗?怎样?(多线程新功能)

尽管这一一般概念在中已经得到了很大程度的阐述,但我想知道关于servlet/http请求是否有什么独特之处,可以提供不同的解决方案。如果不是,就不是


另外,是否可以将请求\u HOLDER ThreadLocal并重写get()方法,以便如果它为null(如从其他线程调用时),它将返回不同的值?-考虑将请求存储在其他地方,并让get()返回该值。

根据
Java
ThreadLocal
变量被初始化,以便它们仅对单个线程可见


当然,任何值都可以共享,因此只需使
ThreadLocal
get()
方法返回的
对象
值可供其他线程访问,但是,这就违背了在一开始就有这样一个变量的目的。

另一种解决方案是从主线程中的请求对象提取所有必要的数据,并将其放入一个单独的数据对象中,而不是干扰ThreadLocal机制,然后将此对象交给新线程。

一位同事建议我在启动新线程时,应传入请求。然后在新线程中,我可以使用来自新线程的请求设置threadlocalrequest_HOLDER。感谢大家的回答

表面上可能存在重复,这违背了线程本地的目的。为什么不共享有意义的数据?@efekactive问得好。这样就可以轻松地从其他文件访问请求,而无需传递id。然后在其他文件中,我们只调用ServletHome.REQUEST\u HOLDER.get(),这到目前为止一直有效,因为我们没有尝试执行任何依赖于使用ServletHome.REQUEST\u HOLDER.get()访问原始请求的多线程工作。我觉得我正在寻找一种不可能的方法,这绝对是我想要的方法,但是已经有很多静态方法引用了本地线程中的请求。我需要调用这些静态方法,但不可能(考虑到时间要求,这是可能的,但不现实)更改它们中的每一个以采用新的参数来实现这一点。然后,您可以将该数据对象传递给另一个线程,同时保持ThreadLocal和任何依赖它的内容不变。
REQUEST_HOLDER.set(request);