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



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

public static final ThreadLocal<HttpServletRequest> REQUEST_HOLDER = new ThreadLocal<HttpServletRequest>();

在服务() 方法中

public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException

然后,Servlet 根据请求设置REQUEST_HOLDER的值。

REQUEST_HOLDER.set(request);

稍后在 servlet 中,我想在另一个线程上进行一些繁重的处理,但仍引用来自 ThreadLocal REQUEST_HOLDER的请求,该在技术上位于不同的线程上。 这可能吗?如何? (多线程的新手)

虽然这个一般概念已经在跨不同线程的 ThreadLocal 值访问中得到了很大程度的解决,但我想知道 servlet/http 请求是否有任何可能提供不同解决方案的独特之处。 如果没有,则不会。

也可以采用REQUEST_HOLDER ThreadLocal 并覆盖 get() 方法,以便如果它是空的(如从不同的线程调用时),它返回不同的值? - 考虑将请求存储在其他地方并让 get() 返回该值。

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

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

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

当然,任何值都可以共享,因此可以使ThreadLocalget()方法返回的Object值可供其他线程访问,但这首先违背了拥有此类变量的目的。

最新更新