Callable
並行して実行して結果を取得したい s がたくさんあります。私のマシンには 12 個のコアがあります。次のコードは、100% の CPU 使用率で期待どおりに動作します。
exec = Executors.newFixedThreadPool(maxThreads);
for(Callable<T> job : jobs) exec.submit(job);
// System runs at 100% CPU.
ただし、タスクが返されたときにその結果を処理したいので、この状況は理想的ではありません。したがって、 をラップしExecutorService
て、 s が完了すると sCompletionService
をキューに入れます。Future
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
呼び出しexecute()
ていることがわかりますが、これがどのようにして奇妙な動作を示すのかわかりません。ExecutorService
submit()
これを引き起こしている可能性のあるものについてのアイデアはありますか?
編集:ここに違いはありません。この速度低下は、コードの別の部分への変更と同時にこの変更が行われたことが原因であり、この 2 つの間に混乱がありました。