2014-02-27 50 views
1

我有一個httpservlet,它必須作出多個連接到不同的服務,以提供答案。這些請求非常少,而且servlet本身的調用由ajax完成,而且我創建的只是一個程序的Web界面,它將被少數用戶同時使用。創建一個線程池到servlet中是不是很糟糕?

現在,我要介紹一個將線程池實例化到servlet中並使其執行我的任務,加入將確保每個線程在繼續之前完成。

我讀過,無論如何,在Servlet中發送垃圾郵件線程是一種不好的做法。 但是使這些連接並行聽起來是處理我的問題的最佳方式。

那麼,你有什麼建議?最好的辦法是什麼?

+0

您是否使用單節點(非集羣)servlet容器(tomcat,jetty)或完整的應用程序服務器? –

+0

這當然是一個壞主意。不要在servlet中創建任何線程。使用單個線程池創建服務並將任務委託給它。 – Stefan

回答

2

這不是一個「壞主意」,但它需要小心完成。根據服務器的負載情況,可用的內存和CPU數量等等,這可能確實是最好的方法。我們一直在做我的工作。

一個很好的起點是使用線程池。 Java 1.5+擁有很好的類別,可稱爲ExecutorService

您可以創建一個共享所有Servlet請求或每個請求一個池的單個池。

擁有一個共享池可爲您提供這些工作線程的絕對上限。每個請求有一個新線程可以保持servlet請求之間的交互(一個請求不能佔用所有線程)。

雖然有一種方法可以考慮您的用例,但您可以使用單個線程來處理多個HTTP調用,具體取決於您使用的庫。他們會在幕後使用nio。我不知道我頭頂上的任何名字。

+0

我已經儘管關於線程池,但我想創建並刪除它在此服務器的doGet方法內:它的唯一功能是管理線程創建,以防止線程垃圾郵件..它會好嗎?更好的一個FixedThreadPool或一個緩存的? – Phate

+0

如果你在doGet裏面做,你知道你需要多少線程,fixedThreadPool更好。如果你正在做一個共享的,或者你不知道你需要多少線程,緩存*可能會更好。 – Daniel

相關問題