2013-01-24 25 views
3

我有一堆Callable,我想要並行運行並獲得結果。我的機器上有12個內核;下面的代碼按預期運行100%的CPU使用率:ExecutorCompletionService只在單個線程中運行,但ExecutorService使用所有CPU

exec = Executors.newFixedThreadPool(maxThreads); 
for(Callable<T> job : jobs) exec.submit(job); 
// System runs at 100% CPU. 

不過,這種情況並不理想,因爲我想爲他們返回處理的任務的結果。因此,我在CompletionService其中排隊的Future S環繞的ExecutorService因爲他們這樣做:

exec = Executors.newFixedThreadPool(maxThreads); 
ecs = new ExecutorCompletionService<T>(exec); 
for(Callable<T> job : jobs) ecs.submit(job); 
// System runs threads one at a time. 

現在我的代碼運行慢12倍。在檢查底層代碼之後,我看到ExecutorCompletionServiceExecutorService上調用​​而不是submit(),但我不明白這會如何導致它顯示奇怪的行爲。

有關可能會導致此問題的任何想法?

編輯:這裏沒有區別。這種放緩是由於在做出這種改變的同時更改了代碼的不同部分而引起的,兩者之間存在混淆。

回答

3

execute(...)應該執行與submit(...)相同的操作。唯一的區別是submit(...)返回FutureExecutorCompletionService不需要將來,因爲它將提交的任務封裝在自己的內部Runnable中。

性能改變必須做一些其他的改變。我知道你向我們展示了ECS構造函數,但只是爲了確保你沒有傳入一個有界的BlockingQueueExecutorCompletionService的權利?使用有界的隊列將阻止線程完成並移動到下一個作業,直到作業出隊。

我們可以看到更多的代碼嗎?

+0

你是對的,它不是由這個變化引起的,後來出現放緩。我誤解了表面上的'ExecutorCompletionService'部分。我們應該刪除這個問題? –

+0

不一定。這可能對其他人有用。你的選擇。 – Gray

+0

我想這對別人很有用。兩者應該是一樣的。我現在就放棄它。 –

0

使用ExecutorService,你能收集通過submit和get()返回的期貨他們的結果嗎?

相關問題