Tomcat JSP 似乎是串行运行(而不是并行运行)——我错过了啥?

Posted

技术标签:

【中文标题】Tomcat JSP 似乎是串行运行(而不是并行运行)——我错过了啥?【英文标题】:Tomcat JSPs appear to be running serially (instead of in parallel) - what am I missing?Tomcat JSP 似乎是串行运行(而不是并行运行)——我错过了什么? 【发布时间】:2012-02-25 17:52:00 【问题描述】:

我在 Tomcat 7 中运行了以下简单的 JSP。容器中没有其他内容,也没有 web.xml。我在三个单独的选项卡 (Chrome) 中的浏览器中快速连续点击了 url http://localhost:8090/test/test.jsp 三次。

<%@ page import="java.util.Date" %>
<%
    out.println("Hello there dude");
    System.out.println("Hello there my friend "+ new Date() +"
                "+Thread.currentThread().getName());
    try 
        Thread.sleep(5000);
     catch(Exception e)
    
        e.printStackTrace();
     
%>

` 当我在 Tomcat 7 或任何其他版本的 Tomcat 中运行它时,JSP servlet 将阻止多个请求,并且我在控制台中得到这样的输出。 你好,我的朋友 Thu Feb 02 19:31:35 MST 2012 http-bio-8090-exec-1 你好,我的朋友 Thu Feb 02 19:31:40 MST 2012 http-bio-8090-exec-3 你好,我的朋友 Thu Feb 02 19:31:45 MST 2012 http-bio-8090-exec-4 如果您检查时间,您将看到 JSP servlet 正在串行执行。我同时启动了它们,所以我相信它们应该在一秒钟内完成,但是后续请求要等到前一个请求完成后才会开始。这些是上面的开始时间,浏览器将在最后一个请求上挂起 15 秒。如果我理解规范,JSP 请求应该并行执行,因为我不要求单线程行为。 有趣的是,Tomcat 分配了不同的线程,如上所示,但它们肯定是串行执行的。这就像容器不会释放一个新的 JSP servlet 线程来处理,直到正在进行的请求完成。我们整天运行 Web 服务,它们似乎可以并行执行。 我在多核 Windows 机器上运行,默认开箱即用的 Tomcat 配置有 200 个可用线程。

【问题讨论】:

在某些浏览器中(我测试过Chrome和Firefox),多个标签页的请求使用相同的http端口请求,浏览器被阻止发送多个请求。具有讽刺意味的是,我没有在 ie9 中看到 3 个或更少的选项卡。所以要小心浏览器,因为它们可能会阻止你的请求,结果可能会让你相信错误的服务器行为,而实际上它是客户端 servlet multithreading 和 Java Servlet concurrent request 的可能重复项 【参考方案1】:

看起来这实际上是浏览器阻塞请求的情况,而不是 Tomcat 阻塞线程的情况。我刚刚在我的 Tomcat 7 安装上尝试了相同的代码,并快速连续运行了 3 次 wget localhost:8060/ThreadTest/ &amp;,所有三个都在 1 秒内完成。

【讨论】:

以上是关于Tomcat JSP 似乎是串行运行(而不是并行运行)——我错过了啥?的主要内容,如果未能解决你的问题,请参考以下文章

从 .java 类而不是 .jsp 在 intelliJ 中运行 servlet

串行执行单元测试(而不是并行)

尽管并行编译,Mex 文件仍串行执行

深入理解同步和异步阻塞和非阻塞并行和串行这几个概念

GPU是并行计算,CPU是串行计算?为啥这么说?

并行,并发,串行,同步,异步,阻塞,非阻塞,同步阻塞,同步非阻塞,异步阻塞,异步非阻塞