【发布时间】:2014-10-01 18:23:14
【问题描述】:
[IMG]http://i60.tinypic.com/121bww0.jpg[/IMG] (请求高代表用户,请链接图像,它将支持该问题。)
嗨, 该图像描绘了我所理解的网络应用程序流程。 浏览器向 Spring Dispatcher servlet 发送请求。 servlet 为每个请求生成一个新线程(我假设默认情况下它会这样做。我不知道它是如何控制的。) 代码如下:
public class Result{
private List<String> response = new ArrayList<String>();
public setResponse(List<String> list){
this.response = list;
}
public list<String> getResponse(){
return response ;
}
}
public class ResponseUtil {
private static final ThreadLocal<Result> responseObject = new InheritableThreadLocal<Result>();
public static void initialize(){
if(responseObject.get() == null){
Result result= new Result();
result.setResponse(new ArrayList<String>());
responseObject.set(result);
}
}
public static void addMessage(String message){
List<String> messages = responseObject.get().getResponse();
messages.add(message);
}
public static Response getResponse(){
return responseObject.get();
}
}
@Component
public class OnboardingEndPointImpl {
public Result processOnBoardingFile() {
ResponseUtil.initialize();
ResponseUtil.addMessage("a");
return ResponseUtil.getResponse();
}
}
在发送两个休息调用时,输出是“a”,“a”。尽管它是本地线程,但该字符串正在附加到同一个列表中。
我的理解是,每个 http 请求(休息调用)都会产生一个新线程。每次调用都从调用 initialize() 方法开始。由于每个请求都是一个新线程,因此每个 http 请求的 threadLocal 必须是分开的,但实际上我是线程正在写入同一个列表。所以所有的消息都被添加到同一个列表中。 只有当这两个调用是同一个线程时才会发生这种行为。
谢谢
【问题讨论】:
标签: java spring servlets httprequest thread-local