tomcat 如何用同一个线程模拟多个请求?
How does tomcat serve multiple requests with same thread simulatenouly?
根据在线提供的各种文档,例如 this,我了解到在 NIO 模式下,maxConnections 不依赖于 maxThreads 参数,并且每个线程可以服务任意数量的连接。
如果我进行线程转储,我会看到我的所有线程都在做什么。这些线程中的每一个都在处理一个请求,并且对于在快速间隔内进行的多个转储之间的 long-运行 请求,此跟踪保持不变,那么这些线程如何同时服务于多个请求。我正在使用 Tomcat v8.0.23,Java v8.0.45.
"http-nio-8080-exec-35" #151 daemon prio=5 os_prio=0 tid=0x00007f5e70021000 nid=0x7337 runnable [0x00007f5f4ebe8000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:150)
at java.net.SocketInputStream.read(SocketInputStream.java:121)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:286)
at java.io.BufferedInputStream.read(BufferedInputStream.java:345)
- locked <0x000000061d4a4070> (a java.io.BufferedInputStream)
at org.apache.thrift.transport.TIOStreamTransport.read(TIOStreamTransport.java:127)
你误会了。
假设我们只考虑同步、阻塞的 Servlet API,那么 Tomcat 将支持 maxConnections,但在任何时候只能将其中的 maxThreads 分配给一个处理线程。
这个想法是,大多数连接在请求之间的 HTTP keep-alive 中基本上是空闲的。因此,单个 Poller 线程监视这些空闲连接,并在有数据要处理时将它们传递给处理线程。
在较早的 Tomcat 版本中,BIO 连接器为一个连接分配了 1 个线程,这样即使连接处于空闲状态,该线程也会被使用,这是低效的。
根据在线提供的各种文档,例如 this,我了解到在 NIO 模式下,maxConnections 不依赖于 maxThreads 参数,并且每个线程可以服务任意数量的连接。
如果我进行线程转储,我会看到我的所有线程都在做什么。这些线程中的每一个都在处理一个请求,并且对于在快速间隔内进行的多个转储之间的 long-运行 请求,此跟踪保持不变,那么这些线程如何同时服务于多个请求。我正在使用 Tomcat v8.0.23,Java v8.0.45.
"http-nio-8080-exec-35" #151 daemon prio=5 os_prio=0 tid=0x00007f5e70021000 nid=0x7337 runnable [0x00007f5f4ebe8000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:150)
at java.net.SocketInputStream.read(SocketInputStream.java:121)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:286)
at java.io.BufferedInputStream.read(BufferedInputStream.java:345)
- locked <0x000000061d4a4070> (a java.io.BufferedInputStream)
at org.apache.thrift.transport.TIOStreamTransport.read(TIOStreamTransport.java:127)
你误会了。
假设我们只考虑同步、阻塞的 Servlet API,那么 Tomcat 将支持 maxConnections,但在任何时候只能将其中的 maxThreads 分配给一个处理线程。
这个想法是,大多数连接在请求之间的 HTTP keep-alive 中基本上是空闲的。因此,单个 Poller 线程监视这些空闲连接,并在有数据要处理时将它们传递给处理线程。
在较早的 Tomcat 版本中,BIO 连接器为一个连接分配了 1 个线程,这样即使连接处于空闲状态,该线程也会被使用,这是低效的。