2011-05-23 55 views
4

我有一個關於Tomcat線程創建的基本問題。每個瀏覽器實例是在單個線程上運行還是產生多個線程來處理單個瀏覽器實例請求?在Tomcat中生成的線程

我正在調用代碼中的當前線程並調用activecount方法,它顯示20表示20個活動線程。所以我懷疑這個值是從哪裏配置的。是否有任何參數設置每個活動線程

while (iter.hasNext()) { 
    GrammarSection agrammarSection= null; 
    try { 
    agrammarSection = (GrammarSection) iter.next(); 
    } catch (Exception e) { 
    System.out.println("DDD if it come in exception "+Thread.currentThread()); 
    System.out.println("DDD if it come in exception "+Thread.activeCount()); //IT PRINTS 20 
+1

如果您使用諸如JConsole或JVisualVM之類的工具,您可以輕鬆(通過GUI)查看活動線程並查看它們是什麼。 – Mikaveli 2011-05-23 08:30:10

回答

2

Tomcat創建一個線程池。通常,一個線程提供一個HTTP請求。

+0

感謝您的回覆。但是,我對Thread.activeCount返回值爲20的原因有疑問.activeCount返回與當前線程的線程組關聯的活動線程數。當我用main方法運行一個獨立的java程序時,activeCount返回1. – user496934 2011-05-23 08:14:39

+0

所以我在這裏有點困惑。我問這個問題的原因是,我看到我的應用程序中的一些異常,可能只發生了多個線程正在執行一個http請求 – user496934 2011-05-23 08:16:34

+2

請參閱我的迴應。另外請注意,Tomcat具有「守護進程」/服務線程,與您的頁面/ servlet沒有直接關係。 – Mikaveli 2011-05-23 08:21:59

1

Tomcat(和大多數servlet容器)使用線程池。也就是說 - 它們預先初始化一個可配置數量的線程,並且無論何時請求到達服務器,線程都會從池中獲取並分配來處理請求。

+0

謝謝......所以有可能線程池中的多個線程可能同時運行來處理一個HTTP請求? – user496934 2011-05-23 08:19:35

+1

沒有。一個請求=一個線程。 (除非你從代碼中啓動你自己的線程) – Bozho 2011-05-23 08:24:17

+0

Tomcat在池中總是有最少數量的「等待」線程,再加上一些'服務'線程(比如偵聽器是否已經部署了新的war文件等等。)。 – Mikaveli 2011-05-23 08:25:33

1

Tomcat使用線程池,看到這個鏈接的配置的簡要概述:「是不是每個瀏覽器實例在單個線程上運行」

Default Tomcat Connector Behaviour

迴應答案是「依賴」:

單個HTTP請求返回文本等將消耗一個接受器線程。但是,如果您的渲染頁面也包含圖像(在同一個服務器實例上)或者它使用了幀,那麼瀏覽器也會爲它們發出請求(因爲每個圖像/頁面都需要向服務器發送另一個HTTP請求)。

而......以上內容涉及HTTP連接器線程。當然,你可以有一個多線程的servlet(執行一些任意的任務)。這將不會計入上面配置中看到的「maxThreads」限制,但會顯示爲JVM中的活動線程。

1

一般情況下並非如此。

在這裏的討論中許多人都談到,1個HTTP請求將由1個Tomcat線程提供服務。但是你不應該認爲1頁只會觸發1個HTTP請求。

至少它取決於你正在使用哪個瀏覽器,1頁中有多少資源,以及是否存在AJAX,保持活動連接。 (1)一個瀏覽器實例會在瀏覽器/客戶端產生多個線程來爲單個頁面下載資源,並且會在Tomcat/Apache/Weblogic/Websphere /任何您使用的應用程序服務器上佔用多個線程。這是由於現代多線程瀏覽器的本質。如果你真的在談論簡單的HTML頁面,它可能會在Tomcat中產生1個(工作)線程,但是當你在頁面中添加其他資源(例如圖像)時,圖像可能(並且很可能)會與頁。瀏覽器通常不會等到加載圖像之前加載整個頁面。當你使用FireBug之類的工具時(在Net部分),你可以清楚地看到這一點。頁面不按順序加載。 (2)在AJAX應用程序中,一個頁面也會在服務器上觸發多個線程。 (3)還要考慮到HTTP 1.1協議(除非您仍在使用HTTP 1.0)將保持連接,直到HTTP超時。它不會默認關閉連接。您需要查看Tomcat/WAR設置中的Keep-Alive參數。您可能需要添加反向代理(例如,Apache,nginx,Squid,Varnish)在Tomcat之前卸載一些這些保持連接。