2014-06-06 34 views
0

我從http://docs.oracle.com/javaee/7/tutorial/doc/servlets012.htm的servlet處理異步如何提高性能

的Java EE提供了servlet和過濾器支持異步處理。如果servlet或過濾器在處理請求時到達可能的阻塞操作,則它可以將操作分配給異步執行上下文,並立即將與請求關聯的線程返回給容器而不生成響應。阻塞操作在異步執行上下文中的不同線程中完成,它可以生成響應或將請求分派給另一個servlet。

我不知道哪裏是

不同的線程來自

?假設容器有10個線程,其中5個是處理請求,那麼我們必須使用另外5個線程來處理長時間運行的業務邏輯。我們在哪裏獲得性能改進?可用的總線程數是有限的,對吧?

謝謝。

回答

1

瞭解更多關於Servlet 3 0 final-spec - Section 2.3.3.3 - Asynchronous processing的地方詳細解釋。

它使容器派遣一個線程,可能從託管線程池運行指定的RunnableAsyncContext是在Servlet 3.0規範中定義的一種標準方式,用於異步處理HTTP請求

基本上HTTP請求不再依賴於一個HTTP螺紋,允許我們稍後處理它,可能使用較少的線程。事實證明,規範提供了一個API來處理開箱即用的不同線程池中的異步線程


瞭解更多關於Executors.newFixedThreadPool()創建一個可重用不受限制的隊列操作線程的固定數目的線程池。在任何時候,最多nThreads線程都將被激活處理任務。如果在所有線程處於活動狀態時提交其他任務,則它們將在隊列中等待,直到線程可用。

請查看ExecutorService以閱讀更多關於它的示例代碼。

+0

是否意味着http線程不如ExcutorService那樣高效。是我們需要處理從http線程到ExcutorService的工作的原因嗎? – huahua

+0

它就像線程中的更多線程一樣。 – Braj

+0

我們可以簡單地增加http線程的數量嗎?爲什麼我們需要在線程內創建更多線程? – huahua