![](/img/trans.png)
[英]How to implement executor service by passing new thread as parameter to execute?
[英]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.