3

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()ていることがわかりますが、これがどのようにして奇妙な動作を示すのかわかりません。ExecutorServicesubmit()

これを引き起こしている可能性のあるものについてのアイデアはありますか?

編集:ここに違いはありません。この速度低下は、コードの別の部分への変更と同時にこの変更が行われたことが原因であり、この 2 つの間に混乱がありました。

4

2 に答える 2

3

execute(...)と同じように実行する必要がありますsubmit(...)。唯一の違いは、 をsubmit(...)返すことFutureです。ExecutorCompletionService送信されたタスクを独自の internal でラップしているため、 future は必要ありませんRunnable

パフォーマンスの変更は、他の変更に対して行う必要があります。あなたが ECS コンストラクターを見せてくれたことは知っていますが、念のために言っておきますがBlockingQueueExecutorCompletionService右に境界を渡していませんか? バインドされたキューを使用すると、ジョブがキューから取り出されるまで、スレッドの完了と次のジョブへの移動が停止します。

コードをもっと見ることができますか?

于 2013-01-24T21:10:34.847 に答える
0

ExecutorService を使用して、submit によって返された Future を収集し、その結果を get() できますか?

于 2013-01-24T21:10:26.797 に答える