2014-05-22 15 views
4

在典型的JAVA應用程序中,配置用於管理全局線程池的全局ExecutorService。可以說,我配置100個線程的固定的線程池:僅使用ExecutorService中的線程子集

ExecutorService threadPool = Executors.newFixedThreadPool(100); 

現在讓我們說,我有1000個文件的列表上傳到服務器,併爲每個上傳我創建了一個調用將要處理的上傳這一個文件。

List<Callable> uploadTasks = new ArrayList<Callable>(); 
// Fill the list with 1000 upload tasks 

我該如何限制併發上傳的最大數量,例如5?

,如果我做

threadPool.invokeAll(uploadTasks); 

我沒有在我的1000個任務將多少線程取得控制權。潛在的100個上傳文件將並行運行,但我只想要最大值5.我想創建某種子執行程序,它使用父執行程序的一部分線程。 我不想創建一個新的分離executorService只是爲了上傳,因爲我想管理我的線程池全局。

你們有沒有人知道如何做到這一點,或者如果現有的實施存在?理想的情況是類似

ExecutorService uploadThreadPool = Executors.createSubExecutor(threadPool,5); 

非常感謝,

安東尼

+0

你可以看看http://stackoverflow.com/q/19819837/2231632看看是否適用於你的情況?你不能單獨使用信號量或某種鎖存器來上傳邏輯? – prabugp

+0

您提到的問題更多關於費率限制。我可以在我的客戶代碼中使用信號量,想知道是否有現成的設施來做這件事。 – lambdacalculus

+1

我認爲典型的Java應用程序有許多線程池,其配置與它們的用例相匹配。所以我希望你的應用程序有一個單獨的5線程線程池用於這個目的。 –

回答

1

在一個典型的Java程序,一個配置管理全局線程池全球的ExecutorService。

我沒有這樣做,但也許我是非典型的。 :-)回到你的問題:

由於具有防護(可能使用SemaphoreCallable的內線只會擾亂互相等待您的全球Executor哪些任務,你就必須要麼

  • 使用一些外部邏輯確保只有5個作業在任何時候運行,這本身可以是一個Callable提交給你的一個Executor。這可以通過用一些邏輯包裝你的下載作業來完成,這將從隊列中提取下一個作業(包含網址或任何其他內容),然後您將這些「排水下載隊列」作業中的五個提交到您的Executor並稱之爲完成。但我並不典型,我只是
  • 使用單獨的Executor下載。這也讓你能夠適當地命名你的線程(在ExecutorThreadFactory),這可能有助於調試並製作漂亮的線程轉儲。
+0

我想我會與你的第一個提議,想知道是否有一些現有的設施這樣做,像 'threadPool.createSubThreadpool(5)' – lambdacalculus

+1

我可以問爲什麼你只需要在你的程序中的一個'Executor'? – Waldheinz

+1

因爲如果應用程序中的每個組件都使用自己的線程池,則不會對程序生成的線程總數有任何可見性。你可能會在不知情的情況下耗盡資源。 – lambdacalculus

相關問題