如何从Java

时间:2017-03-20 21:52:10

标签: java multithreading servlets

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

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

在service()方法中

public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
然后,Servlet会根据请求设置REQUEST_HOLDER的值。

REQUEST_HOLDER.set(request);

稍后在servlet中,我想在另一个线程上做一些繁重的处理,但仍然引用ThreadLocal REQUEST_HOLDER的请求,这在技术上是在不同的线程上。这可能吗?怎么样? (多线程新手)

虽然这个一般概念已经在ThreadLocal value access across different threads中得到了很大的解决,但我想知道是否有任何关于servlets / http请求的独特内容可能会提供不同的解决方案。如果没有,不是。

还可以获取REQUEST_HOLDER ThreadLocal并覆盖get()方法,这样如果它为null(如从不同的线程调用时),它返回一个不同的值? - 考虑将请求存储在其他地方并让get()返回该值。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

一位同事告诉我,当我开始新线程时,我应该传递请求。然后在新线程中,我可以使用来自新线程的请求设置ThreadLocal REQUEST_HOLDER。谢谢大家的回答

答案 2 :(得分:0)

根据const char *line = "donuts,are,cool,and,tasty"; documentationmalloc()变量已初始化,因此它们仅对各个线程可见。

当然,任何值都可以共享,因此可以让null size_t length = strlen(token); fields[i] = malloc(length + 1); if (fields[i] != NULL) { strcpy(fields[i], token); } 方法返回的Java值可供其他线程访问,但是这样做的目的就是失败了首先是一个变量。