2015-10-16 43 views
0

我有以下情形, enter image description here如何實現Excutors

有關tomcat的每一個要求,我們需要從不同的機器上(每臺機器上這裏我們已經有了其他服務)的數據,並作爲響應的執行者服務我們將來自不同機器的所有響應的合併數據發送到該請求。
爲此,我們實施ExcuterServices如下

ExecutorService executor = Executors.newFixedThreadPool(numThreads); 
     List<Future<Object>> results = executor.invokeAll(callables, 2000,TimeUnit.MINUTES); 

這需要爲每個用戶的要求做(和這些要求是> 50號),這是越來越難(創建每個請求3Thread)和資源是有限的。

請建議我如何實現像Executor Services池這樣的設計,其中池中的每個ExceutorServices都有3線程並將這些請求委託給ExecutorServices池。
在此先感謝。

+0

不要在每個請求中創建一個線程或者甚至是ThreadPools!創建一個並重用它或更好看一個微服務。 – Stefan

回答

0

每個請求都需要從不同的機器獲取數據,並且您爲每個請求創建三個線程。然後,您將合併輸出,然後將此響應發送給發出此請求的客戶端。如果你有多個處理器或者你的一些任務是面向I/O的,使用多線程可能是一個不錯的選擇。

這種需要爲每個用戶請求執行(和這些請求是> 50 號),這是越來越困難的(每個請求創建3Thread)和 資源是有限的。

爲每個客戶端請求創建三個線程沒有意義。您需要對您想要一次處理的請求設置一些限制(使用基準測試)。您可以將所有請求保留在隊列中,並且在每個請求可以擁有自己的ExecutorService的時間只處理該號碼。

+0

謝謝阿希爾。對於每一個請求,我必須從3臺機器獲取數據,直到我沒有從三臺機器得到響應(或超時),我不必發送任何響應,我如何實現像這樣的設計 – Pydi

+0

@pydi你可以在提交和使用後使用invokeall或獲得未來的對象得到阻止,直到你得到結果 –

+0

Akhil,我現在做同樣的事情,實際問題是我創建ExecutorService對象與三個線程爲每個請求,我想知道一種方法創建10個ExecutorService(3個線程)對象,併爲每個請求重用這10個ExecutorService對象,而不是爲每個請求創建新的ExecutorService(帶有3個線程)。 – Pydi

0

爲此,我們實施ExcuterServices如下

... 

這需要爲每個用戶的要求做(和這些請求是在數> 50),這是越來越難(每個請求創建3Thread)

您是否正在爲每個請求創建新線程?如果是這樣,那麼不要這樣做。只需創建一個全局池,並將您的三個任務提交給池中的每個請求。如果您預計會有很多請求,那麼如果任務是計算綁定的,那麼池的大小(numThreads)應該與可用的CPU核心數大致相同,或者如果他們要花費更多時間等待做I/O。 (你必須嘗試找到最好的號碼。)


如果,另一方面,我誤解你的問題,你已經創建一個線程池,那麼你的問題沒有按」沒有道理:這是一個固定線程池。它永遠不會超過(或少於)給定的numThreads


[如果我使用一個線程池,然後]我怎樣才能知道,這3個線程是請求1和這3個是要求2 ......?

當您使用ExecutorService,你不應該需要知道你執行任務線程的身份。任務本身應該知道該怎麼做。

您提交的每個任務都是實現Callable接口的對象。無論任務需要做什麼工作,都應該通過它的構造參數提供給它。

...還有我們怎麼能知道這些特定的三個線程完成了?

每次提交Callable實例的ExecutorService時間,你得到一個Future對象。您可以使用Future對象來確定任務是否完成,等待它完成並訪問任務完成時返回的結果。

如果您仍然有疑問,那麼在做任何其他事情之前,您可能應該花一些時間來完成關於併發性的Java教程一章。

http://docs.oracle.com/javase/tutorial/essential/concurrency/

+0

謝謝詹姆斯。如果我創建了一個全局池,並且我爲該池提交了三個任務,那麼我必須等到這三個任務獲得數據,並且這應該針對每個請求完成,這是否會增加響應時間? – Pydi

+0

如果我增加了池中的線程數,併爲每個請求委託三個線程,那麼我怎樣才能知道這3個線程用於請求1,這3個用於請求2,以及我們如何知道那些特定的三個線程完了。 – Pydi

+0

@Pydi看到我添加到上面我的答案結尾的附加信息。 –