Tomcat如何同时为同一线程的多个请求提供服务? [英] How does tomcat serve multiple requests with same thread simulatenouly?

查看:0
本文介绍了Tomcat如何同时为同一线程的多个请求提供服务?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

根据在线提供的各种文档,例如this,我了解使用NIO模式时,MaxConnections不依赖于MaxThread参数,每个线程可以服务任意数量的连接。

如果我进行线程转储,我可以看到我的所有线程都在做什么。这些线程中的每个线程都在处理一个请求,对于在快速间隔内获取的多个转储之间的长时间运行的请求,该跟踪保持不变,那么这些线程如何同时处理多个请求呢?我使用的是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,但任何时候都只能将其中的MaxThread分配给处理线程。

想法是大多数连接在请求之间的HTTP Keep-Alive过程中基本上是空闲的。因此,单个轮询线程监视这些空闲连接,并在有数据要处理时将它们传递给处理线程。

在早期的Tomcat版本中,BIO连接器将一个线程分配给一个连接,以便即使该连接空闲也会使用该线程,这是低效的。

这篇关于Tomcat如何同时为同一线程的多个请求提供服务?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆