2012-02-03 46 views
2

我有以下在Tomcat 7中運行的簡單JSP。容器中沒有其他東西,也沒有web.xml。我在三個單獨的選項卡(Chrome)中從我的瀏覽器快速連續三次點擊url http://localhost:8090/test/test.jspTomcat JSP似乎是串行運行(而不是並行) - 我錯過了什麼?

<%@ page import="java.util.Date" %> 
<% 
    out.println("Hello there dude"); 
    System.out.println("Hello there my friend "+ new Date() +" 
       "+Thread.currentThread().getName()); 
    try { 
     Thread.sleep(5000); 
    } catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
%> 

`

當我在Tomcat的7或任何其他版本的Tomcat運行時,JSP servlet將阻止多個請求我在控制檯中看到如下所示的結果。

你好我的朋友週四年2月2 19點31分35秒MST 2012 HTTP-BIO-8090-EXEC-1
你好我的朋友週四年2月2十九點31分40秒MST 2012 HTTP-BIO-8090 -exec-3
你好我的朋友週四年2月2 19時31分45秒MST 2012 HTTP-BIO-8090-EXEC-4

如果檢查時間,你會看到JSP servlet被執行的順序。我同時開始了所有這些工作,所以我相信他們應該在一秒鐘內完成,但後續請求在上一個請求完成之前不會啓動。這些是上面的開始時間,並且瀏覽器將掛起最後一次請求15秒。如果我理解規範,那麼JSP請求應該並行執行,因爲我不是要求單線程行爲。

有趣的是,Tomcat正在分配不同的線程,如上所示,但它們肯定是連續執行的。這就像容器不會釋放一個新的JSP servlet線程來處理,直到處理請求完成。我們整天運行Webservices,它們似乎並行執行得很好。

我在一個多核Windows窗體上運行,並且默認開箱即用的Tomcat配置有200個線程可用。

+1

在某些瀏覽器(我測試過Chrome和Firefox)中,多個選項卡的請求使用相同的http端口請求,並且瀏覽器被阻止發送多個請求。具有諷刺意味的是,我沒有在ie9中看到3個或更少的選項卡。所以要小心瀏覽器,因爲它們可能會阻止你的請求,並且結果可能導致你相信錯誤的服務器行爲,當它真的是客戶端 – 2012-02-03 03:43:37

+0

[servlet multithreading]可能的重複(http://stackoverflow.com/questions/7681291)/servlet-multithreading)和[Java Servlet併發請求](http://stackoverflow.com/questions/8011138/java-servlet-concurrent-request) – BalusC 2012-02-03 20:02:01

回答

2

看起來很可能這實際上是瀏覽器阻止請求的情況,而不是Tomcat阻止線程。我只是在我的Tomcat 7安裝上嘗試了相同的代碼,並且連續三次運行wget localhost:8060/ThreadTest/ &,並且所有三個代碼都在1秒內完成。

相關問題