前提1 :此问题被标记为this one的副本,其中接受的(仅)答案或多或少是浏览器对多个请求使用相同的HTTP连接,而servlet容器每个连接使用一个线程。这是答案的一半,我试图理解为什么刷新和硬刷新有不同的行为。显然,这不是一个严格的Java问题,但仍然属于编程领域:不是重复,不是OT,imho。无需关闭它,一个有趣的讨论可以从这里开始。
前提2 :我理解使用 F5 和 CTRL + F5 刷新浏览器页面之间的区别,但无论如何,这对我没有帮助。
我有这个servlet
public class MyServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
List<String> items = new ArrayList<>();
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.print(request.getSession().getId()+" accessing list");
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
items.add(""+LocalTime.now().getSecond());
System.out.println(items);
}
//irrelevant code
}
我第一次从浏览器中调用它并等待(稍微多于)4秒钟以获取响应并将我的JSESSIONID与我的浏览器相关联:
18:39:59,823 INFO [...] 5MYxcir_Pz5isCLmWtchZRCx accessing list
18:40:03,823 INFO [...] [3]
现在,我在同一个浏览器中打开三个选项卡,将servlet url粘贴到每个选项卡中,然后依次按Enter键,可能需要两秒钟。这是我得到的输出
18:41:33,534 INFO [...] 5MYxcir_Pz5isCLmWtchZRCx accessing list
18:41:37,534 INFO [...] [3, 37]
18:41:37,542 INFO [...] 5MYxcir_Pz5isCLmWtchZRCx accessing list
18:41:41,543 INFO [...] [3, 37, 41]
18:41:41,549 INFO [...] 5MYxcir_Pz5isCLmWtchZRCx accessing list
18:41:45,549 INFO [...] [3, 37, 41, 45]
看起来每个请求都是按顺序处理的:对于每个要处理的请求,您必须等待前一个请求被终止。
但如果我回到三个标签并快速 CTRL + F5 ,我会得到我期待的行为:
18:46:37,812 [...] 5MYxcir_Pz5isCLmWtchZRCx accessing list
18:46:38,838 [...] 5MYxcir_Pz5isCLmWtchZRCx accessing list
18:46:39,571 [...] 5MYxcir_Pz5isCLmWtchZRCx accessing list
18:46:41,815 [...] [3, 37, 41, 45, 41]
18:46:42,838 [...] [3, 37, 41, 45, 41, 42]
18:46:43,571 [...] [3, 37, 41, 45, 41, 42, 43]
每个请求都是并行运行的。 最后一次测试,如果我只是 F5 ,我会回到意想不到的顺序行为
18:50:10,581 [...] 5MYxcir_Pz5isCLmWtchZRCx accessing list
18:50:14,582 [...] [3, 37, 41, 45, 41, 42, 43, 14]
18:50:14,590 [...] 5MYxcir_Pz5isCLmWtchZRCx accessing list
18:50:18,591 [...] [3, 37, 41, 45, 41, 42, 43, 14, 18]
18:50:18,597 [...] 5MYxcir_Pz5isCLmWtchZRCx accessing list
18:50:22,597 [...] [3, 37, 41, 45, 41, 42, 43, 14, 18, 22]
有谁能帮我理解幕后发生的事情?为什么我的请求有时会按顺序处理?
我在Windows,WildFly 8.x AS,Chrome或Firefox(相同的行为)下。
我使用[...]
来缩短输出,但它表明每个请求都由不同的线程处理(确切地说是不同的Thread.currentThread().getName()
值)。这意味着我没有“每个连接一个线程”,我变得更加困惑......