很明显,一个servlet可以同时处理多个请求。例如,在服务器上建立一个连接(一个套接字),为了处理这个连接,服务器创建一个新线程,该线程调用servlet的doGet并去做一些事情。当它正在做某事时,另一个请求到达。新线程将使用其他 httpRequest 和 httpResponse 实例调用 doGet。我使用 netbeans 和 glasfish 做了一个测试。在 servlet 的 doGet 中我放入:
synchronized(obj){
try{
obj.wait(50000)
}catch(InterruptedException e)
{
}
当第一个请求到达时,servlet 在 50 秒之前不再接受任何请求。这意味着为了捕获后续请求,前一个线程必须完成其工作并返回以获取另一个请求。为了确保这不是因为同步语句,我在同步之前在某些语句上放置了断点,但从未到达。
最佳答案
Servlet 框架通常是多线程的。
我可以想到两种可能的解释:
您的客户端是单线程的;即,在收到第一个请求的响应之前,不会发送第二个请求。
不知何故,您仅使用一个工作线程配置了 GlassFish。
也有可能您的测试误导了您,以确保问题不是 obj
锁。尝试更改为使用本地锁;例如
Object obj = new Object(); // ensure nothing else can see it!!
synchronized (obj) {
try {
obj.wait(50000)
} catch (InterruptedException e) {
}
关于java - 看起来Servlet中只有一个线程处理所有请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45518237/