Tomcat的线程池是如何工作的?

17

所以这是我的理解。

Apache Tomcat的线程池(它被称为连接器线程池吗?)有一定数量的线程(默认为200)。现在这意味着在特定时间内,200个人可以与我的Web应用程序通信。

现在考虑当一个人连接到我的应用程序时的场景。我会收到请求,服务器上的Tomcat客户端会检查是否有任何可用的线程来处理该请求。如果有,则很好,否则我们会返回一些错误代码。现在,在成功的情况下,我已分配给该请求的一个线程是否会与该特定客户端相关联,直到他的请求未被处理?

基本上,作为用户,如果我去访问www.myApp.com,我从线程池中获取一个线程,该线程从服务器获取所有信息并将最终的HTML返回给我。之后,线程就空闲了并回到池中。现在,如果我再次点击其他内容,然后再次访问线程池并获取可用的线程,这一过程将一直进行。是这样工作的吗?

问题2

假设我在服务器端有一个Java应用程序。因此,当我单击URL时,它会将我带到某些Java代码。现在,如果我在我的Java代码中创建新线程,那么这些线程会从Tomcat的线程池中获取,还是会从Java创建的线程池中获取?此时Tomcat的线程执行会发生什么情况?

谢谢。

如果您知道的话,请提供一些Tomcat官方参考/资源,我可以在其中阅读有关此类事情的内容。谢谢。


  1. 是的,您的理解在概念上是正确的。
  2. 那个线程将执行您的代码。如果您创建一个新线程,它与Tomcat的线程池无关。Tomcat的线程将继续按照通常的方式运行。
- Jason C
1
@JarrodRoberson 别忘了,并不是所有的任务都是 CPU 绑定的。能够同时连接的人数并不完全与能够同时运行的 CPU 线程数相连。此外,即使是在同一个核上引用多个线程时,我们通常也使用“并发”这个词。 - Jason C
1
@JarrodRoberson 当你提到没有Java Threadpool这样的东西时,你具体是在建议什么?什么是更合适的术语?我指的是我的Java应用程序创建的Threadpool。 - Kraken
1
@Kraken:AJAX请求与其他HTTP请求没有区别。 - JB Nizet
3
“异步(asynchronously)”和“并发(concurrent)”不是相同的概念,初学者容易混淆这两者的含义。对于这些人来说,继续解释它们的区别反而会使他们更加困惑,因为已经有了适当的术语可以使用。一个四核系统只能同时为4个客户提供服务,但通过在单个线程上使用非阻塞I/O,可以异步地为数千甚至数万个客户提供服务,而不需要任何并发操作。 - user177800
显示剩余8条评论
1个回答

20
现在这意味着,在特定时间内,有200人可以使用我的Web应用程序进行交流。

不完全是。这意味着您的服务器可以同时处理200个请求1。可能还有其他请求在等待线程可用的队列中排队。

现在,如果成功,我分配给该请求的一个线程是否会与该特定客户端相关联,直到处理他的请求为止?

是的…除非您正在使用最近版本Servlet规范中添加的异步请求处理功能。(在这种情况下,使用200个线程可能会同时处理超过200个请求。但这将导致一个请求放弃控制权以等待某些事件发生时,另一个请求接管。阅读this作简要介绍。)

这就是它的工作方式吗?

或多或少…

1- 严谨来说,要想在同一时刻处理200个请求,您(可能)需要200多个核心。因此,我从终端用户的角度使用“同时”,他们无法看到服务器“黑匣子”内部实际发生了什么。但是话虽如此,一个物理线程/核心在同一时刻为多个请求执行工作也并非不可能。最明显的情况是有许多相同的请求一起处理。


假设我有一个Java应用程序在我的服务器端。当我访问某个url时,它会带我到一些Java代码。那么,从Tomcat线程池中获得的线程将执行我的代码吗?
这没有意义。如果你在服务器端有一个Java应用程序,那么你需要解释如何从HTTP请求(“访问URL”)转到运行Java应用程序。只有这样,我们才能告诉你是否涉及线程池线程。
如果是这样,如果我在我的Java代码中创建新线程会发生什么?那些线程会从Tomcat的线程池中获取还是从Java创建的线程池中获取?在这种情况下,Tomcat的线程执行会发生什么?
再次强调,这取决于您的Java应用程序如何运行。例如,如果您的Web应用程序使用Runtime.exec("java ... classname")在服务器端运行应用程序,则它与Tomcat处于单独的JVM中,应用程序线程将不在Tomcat线程池中。
也有人指出,实际上并没有所谓的“Java线程池”。如果您的Java应用程序选择这样做,它可以创建和使用线程池。但是,如果不这样做,则Java线程不会被汇集在一起。它们在终止时大部分被丢弃,并且在垃圾回收Thread对象时,任何剩余的数据结构都会被回收。

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