似乎只有一个线程处理Servlet中的所有请求

时间:2017-08-05 04:34:01

标签: java multithreading servlets

很明显,servlet可以同时处理多个请求。例如,在服务器(套接字)上建立连接,为了处理此连接,服务器创建一个新线程,该线程调用servlet的doGet并继续执行某些操作。当它正在做某事时另一个请求到来。新线程将使用其他httpRequest和httpResponse实例调用doGet。我使用netbeans和glasfish进行了测试。在servlet的doGet中我放了:

synchronized(obj){
 try{  
 obj.wait(50000)
   }catch(InterruptedException e)
    {
    }

当第一个请求到达时,servlet在50秒之前不再接受任何请求。这意味着对于要捕获的后续请求,前一个线程必须完成其工作并返回以获取另一个请求。为了确保这不是因为同步语句,我在同步之前在某些语句中设置了一个断点但从未到达过。

2 个答案:

答案 0 :(得分:1)

Servlet框架通常是多线程的。

我可以想到两种可能的解释:

  • 您的客户端是单线程的;即,在收到第一个请求后,才会发送第二个请求。

  • 不知何故,您只使用一个工作线程配置了GlassFish。

您的测试也可能误导您,以确保问题不是obj锁定。尝试将其更改为使用本地锁;例如

   Object obj = new Object();  // ensure nothing else can see it!!
   synchronized (obj) {
       try {  
           obj.wait(50000)
       } catch (InterruptedException e) {
   }

答案 1 :(得分:0)

通常,如果您没有更改servlet容器中工作线程大小的默认配置,则servlet是多线程的。

在您的情况下,根据您的描述中的结果,我认为obj是一个共享变量,如类变量,实例变量等。 所以你有一个错误,你不应该在obj1实例上同步,因为这将使它成为顺序。

您可以更改测试用例,如:

    System.out.println(Thread.currentThread());
    try {
        Thread.sleep(50000);
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
    }

看到结果。