簡體   English   中英

如何實施執行人的執行人服務

[英]How to implement Executor Service of Excutors

我有以下情況, 在此處輸入圖片說明

對於tomcat上的每個請求,我們需要從不同的機器上獲取數據(這里我們已經在每台機器上提供了REST服務),作為響應,我們將來自不同機器的所有響應的合並數據發送到該請求。
為此,我們實現了ExcuterServices,如下所示

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

這需要針對每個用戶請求(這些請求的數量大於50)進行操作,這變得越來越困難(每個請求創建3Thread)並且資源有限。

請建議我如何實現像Executor Services池這樣的設計,其中池中的每個ExceutorServices具有3個線程,並將這些請求委托給ExecutorServices池。
提前致謝。

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

這需要針對每個用戶請求(這些請求的數量大於50)進行操作,這變得越來越困難(每個請求創建3Thread)並且資源有限。

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

為此,我們實現了ExcuterServices,如下所示

 ... 

這需要針對每個用戶請求(並且這些請求的數量大於50),這變得越來越困難(每個請求創建3個線程)

您是否正在為每個請求創建一個新的線程 如果是這樣,那就不要那樣做。 只需創建一個全局池,然后針對每個請求將三個任務提交到池中。 如果您預計會有很多請求,那么如果任務是受計算限制的,則池的大小( numThreads )應該與可用的CPU核心數量相同,或者如果它們要花時間等待,則可能更多I / O。 (您必須嘗試才能找到最佳號碼。)


另一方面,如果我誤解了您的問題,而您已經創建一個線程池,那么您的問題就沒有意義了:這是一個固定的線程池。 它永遠不會超過(或少於)給定的numThreads


[如果使用線程池,那么]我如何知道這3個線程是針對請求1的,而這3個線程是針對請求2的...?

使用ExecutorService ,您無需知道執行任務的線程的標識。 任務本身應該知道該怎么做。

您提交的每個任務都是一個實現Callable接口的對象。 無論任務需要執行什么信息,都應通過其構造函數參數提供給它。

...以及我們如何知道那三個特定線程完成了?

每次將Callable實例提交給ExecutorService ,都將返回Future對象。 您可以使用Future對象查明任務是否完成,等待任務完成以及訪問任務完成時返回的結果。

如果仍然有疑問,那么在執行其他任何操作之前,您可能應該花一些時間來完成有關並行性的Java教程章節。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM