Tomcat生成的线程

4

我有一个关于Tomcat线程创建的基本问题。每个浏览器实例是在单个线程上运行还是会生成多个线程来处理单个浏览器实例请求?

在代码中,我引用了当前线程并调用了activecount方法,它显示20,这表示有20个活动线程。所以我怀疑这个值是从哪里配置的。是否有任何参数可以设置每个活动线程数?

while (iter.hasNext()) {
  GrammarSection agrammarSection= null;
  try {
    agrammarSection = (GrammarSection) iter.next();
  } catch (Exception e) {
    System.out.println("DDD if it come in exception "+Thread.currentThread());
    System.out.println("DDD if it come in exception "+Thread.activeCount()); //IT PRINTS 20

1
如果您使用像JConsole或JVisualVM这样的工具,您将能够轻松地(通过GUI)查看活动线程并了解它们的情况。 - Michael
4个回答

2

Tomcat创建了一个线程池。通常情况下,一个HTTP请求由一个线程来处理。


感谢您的回复。然而,我有一个疑问,为什么Thread.activeCount返回20的值。activeCount返回与当前线程的线程组关联的活动线程数。当我运行一个带有main方法的独立Java程序时,activeCount返回1。 - user496934
所以我在这里有点困惑。我提出这个问题的原因是我在我的应用程序中看到了一些异常,这些异常只有在一个HTTP请求执行了多个线程时才会发生。 - user496934
2
请查看我的回复。此外,请注意Tomcat具有“守护进程”/服务线程,与您的页面/Servlet没有直接关系。 - Michael

1

Tomcat(以及大多数Servlet容器)使用线程池。也就是说,它们预先初始化了可配置数量的线程,每当有请求到达服务器时,就会从池中取出一个线程并分配给处理该请求。


谢谢...所以线程池中的多个线程可能会并发运行以处理一个HTTP请求吗? - user496934
2
每个请求都是一个线程(除非您从代码中启动自己的线程)。 - Bozho
Tomcat池中始终有最少数量的“等待”线程,以及一些“服务”线程(例如检测是否部署了新的war文件的监听器等)。 - Michael

1

Tomcat使用线程池,有关配置的简要概述请参见以下链接:

默认Tomcat连接器行为

针对“每个浏览器实例是否在单个线程上运行?”的回答是“取决于”:

返回文本等的单个HTTP请求将消耗一个接受者线程。

但是,如果您呈现的页面也包括图像(在同一服务器实例上)或者如果它使用框架,则浏览器也会为它们发出请求(因为每个图像/页面都需要向服务器发出另一个HTTP请求)。

而且...上述内容涉及HTTP连接器线程。当然,您可以拥有一个多线程的Servlet(执行某些任意任务)。这不会计入上面配置中看到的“maxThreads”限制,但将显示为JVM中的活动线程。


1

总的来说,通常并不是这样。

讨论中有很多人认为1个HTTP请求将由1个Tomcat线程提供服务。但你不应该认为1个页面只会触发1个HTTP请求。

至少这取决于你使用的浏览器、1个页面中有多少资源以及是否涉及AJAX、保持连接等因素。

(1) 一个浏览器实例将在浏览器/客户端端上生成多个线程以下载单个页面的资源,并且将占用Tomcat/Apache/Weblogic/Websphere/您使用的任何应用程序服务器上的多个线程。这是现代多线程浏览器的本质所致。如果您真正谈论的是简单的HTML页面,它可能只会在Tomcat中生成1个(工作)线程,但是当您向页面添加其他资源(如图像)时,图像可能(并很可能)与页面一起下载。浏览器通常不会等到整个页面加载完毕后再加载图片。当您使用诸如FireBug(在“Net”部分上)之类的工具时,您可以清楚地看到这一点。页面不是按顺序加载的。

(2)在AJAX应用程序中,一个页面也会在服务器上触发多个线程。

(3) 还要考虑到 HTTP 1.1 协议(除非您仍在使用 HTTP 1.0)将保持连接直到 HTTP 超时。它不会默认关闭连接。您需要查看 Tomcat/WAR 设置中的 Keep-Alive 参数。您可能需要在 Tomcat 前面添加反向代理(例如 Apache、nginx、Squid、Varnish)以卸载一些这些 keep-alived 连接。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接