【问题标题】:How exactly does Tomcat's Threadpool work [closed]Tomcat的线程池究竟是如何工作的[关闭]
【发布时间】:2014-05-16 06:39:08
【问题描述】:

这是我的理解。

Apache Tomcat 的线程池(是否称为连接器线程池?)有多个线程(默认为 200)。现在这意味着在特定时间,200 人可以与我的 Web 应用程序进行通信。

现在,以一个特定连接到我的应用程序的场景为例。我收到一个请求,服务器上的 tomcat 客户端检查是否有任何线程可用于满足该请求。如果它是好的,否则我们会返回一些错误代码。现在,如果成功,我分配给该请求的那个线程是否会与该特定客户端相关联,直到他的请求未被处理?

基本上,作为用户,如果我转到www.myApp.com,我会从线程池中获取一个线程,该线程会从服务器获取所有信息并将最终的 html 返回给我。之后线程空闲并返回池。现在,如果我单击其他内容,然后再次转到线程池并分配一个线程(如果可用)并继续运行。是这样的吗?

问题 2

假设我的服务器端有一个 Java 应用程序。因此,当我点击一个 url 时,它会将我带到一些 java 代码。现在是不是,我从 Tomcat Threadpool 获得的线程,该线程将执行我的代码?

如果是这样,如果我在我的 java 代码中创建新线程会发生什么,这些线程是从 Tomcat 的线程池中获取还是从创建的 Java 的线程池中获取?另外,这种情况下Tomcat的线程执行会怎样?

谢谢。

如果您知道的话,请提供一些 Tomcat 官方参考资料/资源,我可以在其中阅读这些内容。干杯。

【问题讨论】:

  • 1.是的,您的理解在概念上是正确的。 2. 该线程将执行您的代码。如果你创建一个新线程,它与 Tomcat 的线程池无关。 Tomcat 的线程继续照常运行。
  • @JarrodRoberson 不要忘记并非所有任务都受 CPU 限制。可以“并发”连接的人数并不是 100% 连接到可以并发运行的 CPU 线程数。此外,即使在指代同一内核上的多个线程时,我们通常也会使用“并发”一词。
  • @JarrodRoberson 当您说没有 Java 线程池之类的东西时,您到底在暗示什么。什么是更贴切的术语。我的意思是我的 Java 应用程序创建的线程池。
  • @Kraken:AJAX 请求与其他 HTTP 请求没有什么不同。
  • @JasonC asynchronously notconcurrent 相同,两者被混为一谈初学者的事情,并且继续混淆他们试图解释你的意思而不是使用已经存在的适当语义,这对他们不利。 4核系统只能同时服务4个客户端,它可以在单个非阻塞I/O异步服务数千或数万个客户端没有任何并发的线程。

标签: java multithreading tomcat threadpool


【解决方案1】:

现在这意味着在特定时间,200 人可以与我的 Web 应用程序进行通信。

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

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

是的...除非您使用的是在最新版本的 Servlet 规范中添加的异步请求处理功能。 (在这种情况下,可能有可能使用 200 个线程“同时”处理 200 多个请求。但这需要一个请求在等待某事发生时将控制权交给另一个请求。请阅读this 了解介绍。)

它是这样工作的吗?

或多或少...

1 - 学究起来,您(可能)需要 200 多个内核才能同时处理 200 个请求。因此,我从最终用户的角度使用“同时”,他们不知道服务器“黑匣子”内部实际发生的事情。但是话虽如此,一个物理线程/内核同时为多个请求执行工作并非不可能。最明显的情况是有很多相同的请求一起处理。


假设我的服务器端有一个 Java 应用程序。因此,当我点击一个 url 时,它会将我带到一些 java 代码。现在是不是,我从 Tomcat Threadpool 获得的线程,该线程将执行我的代码?

这没有意义。如果您在服务器端有一个 Java 应用程序,那么您需要说明如何从 HTTP 请求(“点击 [原文如此] 一个 url”)到运行 Java 应用程序。只有这样我们才能告诉你是否涉及线程池线程。

如果是这样,如果我在我的 java 代码中创建新线程会发生什么,这些线程是从 Tomcat 的线程池中获取还是从创建的 Java 的线程池中获取?另外,这种情况下Tomcat的线程执行会怎样?

再一次,这取决于您的 Java 应用程序是如何运行的。例如,如果您的 webapp 使用 Runtime.exec("java ... classname") 在服务器端运行应用程序,那么它与您的 Tomcat 位于一个单独的 JVM 中,并且所有应用程序线程都不会在 Tomcat 线程池中。

也有人指出,没有“Java 线程池”本身。如果您的 Java 应用程序选择这样做,它可以创建和使用线程池。但如果不是,则 Java 线程不会被池化。它们在终止时大部分被丢弃,并且在 Thread 对象被垃圾回收时回收所有剩余的数据结构。

【讨论】:

    猜你喜欢
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 2021-08-15
    • 2012-06-08
    • 2011-10-11
    • 2013-07-05
    • 1970-01-01
    相关资源
    最近更新 更多