【发布时间】:2018-11-19 17:54:13
【问题描述】:
假设 Tomcat 最多支持 5 个线程,并且 5 个线程正在进行中(假设这些请求会花费很多时间)。现在请求中的 1 个创建了另外 2 个执行某些操作的线程,
- 那么这 2 个线程将获得 CPU 还是等待?
- 如果他们等待,他们是否在操作系统队列中等待? (接受连接队列)
【问题讨论】:
标签: java multithreading tomcat7 java-threads
假设 Tomcat 最多支持 5 个线程,并且 5 个线程正在进行中(假设这些请求会花费很多时间)。现在请求中的 1 个创建了另外 2 个执行某些操作的线程,
【问题讨论】:
标签: java multithreading tomcat7 java-threads
这里是the documentation for maxThreads:
服务器在任何给定时间接受和处理的最大连接数。当达到此数量时,服务器将接受但不处理另一个连接。此附加连接将被阻止,直到正在处理的连接数低于 maxConnections,此时服务器将再次开始接受和处理新连接。请注意,一旦达到限制,操作系统可能仍会根据 acceptCount 设置接受连接。默认值因连接器类型而异。对于 BIO,默认值为 maxThreads 的值,除非使用 Executor,在这种情况下,默认值为来自 executor 的 maxThreads 的值。对于 NIO,默认值为 10000。对于 APR/native,默认值为 8192。
线程限制是为内部池配置的最大数量,Tomcat 用于分配给传入请求。这不是 JVM 使用的线程数的硬性限制。
如果您的请求在其工作过程中创建了更多线程(调用new Thread()),则这些线程不是来自池,而是来自操作系统的请求。
但最好的方法可能是使用单独的专用线程池。您始终可以配置自己的线程池并让您的请求从该池中获取线程。这样,您就不会在线程之外运行系统(如果某些事情失控并且线程开始挂起,您可能会冒着创建新线程的风险)并且您不会降低 Tomcat 服务请求的能力(您会如果您使用了 Tomcat 的池,请执行此操作)。
【讨论】: