【问题标题】:What if any request create more thread in tomcat threadpool如果任何请求在 tomcat 线程池中创建更多线程怎么办
【发布时间】:2018-11-19 17:54:13
【问题描述】:

假设 Tomcat 最多支持 5 个线程,并且 5 个线程正在进行中(假设这些请求会花费很多时间)。现在请求中的 1 个创建了另外 2 个执行某些操作的线程,

  1. 那么这 2 个线程将获得 CPU 还是等待?
  2. 如果他们等待,他们是否在操作系统队列中等待? (接受连接队列)

【问题讨论】:

    标签: java multithreading tomcat7 java-threads


    【解决方案1】:

    这里是the documentation for maxThreads:

    服务器在任何给定时间接受和处理的最大连接数。当达到此数量时,服务器将接受但不处理另一个连接。此附加连接将被阻止,直到正在处理的连接数低于 maxConnections,此时服务器将再次开始接受和处理新连接。请注意,一旦达到限制,操作系统可能仍会根据 acceptCount 设置接受连接。默认值因连接器类型而异。对于 BIO,默认值为 maxThreads 的值,除非使用 Executor,在这种情况下,默认值为来自 executor 的 maxThreads 的值。对于 NIO,默认值为 10000。对于 APR/native,默认值为 8192。

    线程限制是为内部池配置的最大数量,Tomcat 用于分配给传入请求。这不是 JVM 使用的线程数的硬性限制。

    如果您的请求在其工作过程中创建了更多线程(调用new Thread()),则这些线程不是来自池,而是来自操作系统的请求。

    但最好的方法可能是使用单独的专用线程池。您始终可以配置自己的线程池并让您的请求从该池中获取线程。这样,您就不会在线程之外运行系统(如果某些事情失控并且线程开始挂起,您可能会冒着创建新线程的风险)并且您不会降低 Tomcat 服务请求的能力(您会如果您使用了 Tomcat 的池,请执行此操作)。

    【讨论】:

      猜你喜欢
      • 2016-05-21
      • 1970-01-01
      • 2014-11-16
      • 2013-06-01
      • 1970-01-01
      • 2011-09-18
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多