2012-04-08 77 views

回答

15

在處理請求的大多數情況下,您正在阻止或等待某些外部資源/條件。在這種情況下,你正在佔用線程(因此有很多內存)而沒有做任何工作。

使用servlet 3.0,您可以提供數千個併發連接,遠遠超過可用線程。想想一個能夠提供有限吞吐量下載文件的應用程序。大多數時候你的線程都處於空閒狀態,因爲它們正在等待發送下一塊數據。在普通的servlet中,即使大部分時間這些線程都處於空閒/休眠狀態,您仍然無法爲更多的客戶端提供比HTTP線程更多的客戶端。

在servlet 3.0中,您可以擁有數千個具有少量HTTP線程的連接客戶端。你可以在我的文章一個真實的例子:這個問題啓發Tenfold increase in server throughput with Servlet 3.0 asynchronous processingRestrict download file bandwidth/speed in Servlet

是由startAsync創建線程不知何故便宜?

沒有線程由startAsync創建!它只是告訴servlet容器:嘿,雖然doGet/doPost方法完成,但我沒有完成這個請求,請不要關閉。這是重點 - 你可能不會每個異步請求創建新的線程。這裏是另一個例子 - 您有成千上萬的瀏覽器使用等待股價變化。在標準servlet中,這意味着:數千個等待某個事件的空閒線程。

使用servlet 3.0,您可以將所有異步請求保留在ArrayList或某個隊列中。當股票價格變動到來時,一個接一個地發送給所有的客戶。在這種情況下不需要超過一個線程 - 並且所有HTTP線程都可以自由處理剩餘的資源。

+0

謝謝!這很有道理:) – Aivar 2012-04-09 07:31:53

+0

...但不幸的是,它對我來說還不完全清楚。看起來我很困惑,因爲我學習了AsyncContext的例子。我寫了關於這個問題的另一個問題,也許你也可以看看這個:http://stackoverflow.com/questions/10073392/whats-the-purpose-of-asynccontext-start-in-servlet-3-0 – Aivar 2012-04-09 12:48:45

4

使用servlet 3.0,您可以保持在ArrayList或某個隊列中等待的所有異步請求 問題是這樣的。您仍然需要一個新的線程來處理請求並提取最終發送響應的請求。 所以我們釋放了http線程,但必須創建一些線程來處理請求

相關問題