我读过Web服务器实例化servlet一次,然后为每个对这个servlet的请求调用它的doGet()
和doPost()
方法。如果有100个同时请求这个servlet并且web服务器有对于一个这样的请求调用doGet()
,是否会阻止其他99个请求,直到被调用的doGet()
方法返回?
答案 0 :(得分:6)
不,它不会,它只会在100个不同线程中的同一个servlet实例上调用doGet()。如果没有空闲线程来处理请求,则会阻止传入请求。
答案 1 :(得分:4)
不,在正常情况下,为每个请求创建新的线程。
您可以为servlet容器中的每个设置线程数。
您也可以将线程设置为阻止。
答案 2 :(得分:2)
所有请求都将在一个单独的线程中处理,因此它不会阻塞。每当一个新请求到来时,包含器将生成一个新线程来处理它。
这就是Java Servlet规范3.0关于处理请求的内容
基本Servlet
接口定义了处理客户端请求的服务方法。
为servlet容器路由到实例的每个请求调用此方法
一个servlet。
处理对Web应用程序的并发请求通常需要
Web Developer设计servlet,可以处理在其中执行的多个线程
特定时间的服务方法。
通常,Web容器处理对同一servlet
的并发请求
在不同的线程上并发执行服务方法。
答案 3 :(得分:2)
Web服务器生成一个线程来为每个客户端提供服务。因此,即使您有一个servlet,每个客户端也会通过不同的线程调用每个方法 所以你可以理解,不会阻止它 这就是你开发人员负责确保您的servlet是线程安全的原因
答案 4 :(得分:2)
通常,它取决于servlet容器。然而,大多数是多线程的。他们将在多个线程中调用doGet()
100次,因此多个线程可以同时使用相同的servlet对象。因此,您必须使您的servlet在线程安全,或者您的servlet似乎在低负载下工作,但在您开始获得更多请求时神秘地崩溃。
答案 5 :(得分:1)
否强>
因为doGet和doPost不同步。
方法签名是
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
因此,完全由您负责处理其他人在此提及的多线程场景。
是强>
比方说,在代码执行路径中,例如,假设您在doGet()方法中调用如下方法
doGet(..){
ObjectApple.doRipe() --> ObjectWater.needMoreWater()
}
- - >表示第一个方法调用/调用另一个
并且在ObjectWater的实现中,您有一个共享资源(应该是 为了线程安全而同步)就像一个成员变量,当然所有其他99个线程都将被阻塞 - 如果它是一个阻塞资源/数据结构。