我有一堆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倍。在檢查底層代碼之後,我看到ExecutorCompletionService
在ExecutorService
上調用而不是submit()
,但我不明白這會如何導致它顯示奇怪的行爲。
有關可能會導致此問題的任何想法?
編輯:這裏沒有區別。這種放緩是由於在做出這種改變的同時更改了代碼的不同部分而引起的,兩者之間存在混淆。
你是對的,它不是由這個變化引起的,後來出現放緩。我誤解了表面上的'ExecutorCompletionService'部分。我們應該刪除這個問題? –
不一定。這可能對其他人有用。你的選擇。 – Gray
我想這對別人很有用。兩者應該是一樣的。我現在就放棄它。 –