2017-08-05 45 views
0

很明顯,一個servlet可以同時處理多個請求。例如,在服務器(一個套接字)上建立一個連接,爲了處理這個連接,服務器創建一個新的線程,線程調用servlet的doGet,並去做一些事情。當它正在做另一個請求到達時。一個新的線程會調用其他httpRequest和httpResponse實例的doGet。我使用netbeans和glasfish做了測試。在一個servlet的的doGet我把:似乎只有一個線程處理Servlet中的所有請求

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

當第一個請求到達時,servlet不接受任何請求,直到50秒。這意味着對於後面的請求被捕獲,前一個線程必須完成它的工作並返回到另一個請求。可以肯定的是,這不是因爲同步語句,我在同步之前在某個語句上放置了一個斷點,但從未到達過。

回答

1

Servlet框架通常是多線程的。

我能想到的兩種可能的解釋:

  • 您的客戶端是單線程的;即您的第二個請求在收到第一個請求之前不會發送。

  • 不知何故,您已經配置GlassFish只有一個工作線程。

它也有可能是你已經被你的測試誤導,以確保問題不在於obj鎖。嘗試改變它以使用本地鎖;例如

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

通常情況下,如果您不更改有關servlet容器中工作線程大小的默認配置,則該servlet爲多線程。

就你的情況而言,根據你描述的結果,我認爲obj是一個共享變量,如類變量,實例變量等。 所以你有一個錯誤,你不應該在obj1實例上同步,因爲這會使它成爲順序的。

你可以改變你的測試案例,如:

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

並觀察結果。

相關問題