3

我有一堆Callables 我想并行运行并获得结果。我的机器上有 12 个内核;以下代码在 100% CPU 使用率下按预期工作:

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

但是,这种情况并不理想,因为我想在任务返回时对其结果进行处理。因此,我将 s 包装ExecutorService在 a中,当它们完成CompletionService时将它们排队: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(),但我不明白这将如何导致它表现出奇怪的行为。

关于可能导致这种情况的任何想法?

编辑:这里没有区别。速度变慢是由于在进行此更改的同时对代码的不同部分进行了更改,并且两者之间存在混淆。

4

2 回答 2

3

execute(...)应该执行相同的submit(...)。唯一的区别是submit(...)返回一个Future. ExecutorCompletionService不需要未来,因为它将提交的任务包装在自己的内部Runnable

性能更改必须针对其他一些更改。BlockingQueue我知道您向我们展示了 ECS 构造函数,但只是为了确保您没有传入ExecutorCompletionService右边界?使用有界队列将阻止线程完成并移动到下一个作业,直到作业出队。

我们可以看到更多的代码吗?

于 2013-01-24T21:10:34.847 回答
0

使用 ExecutorService,你能收集到 submit 和 get() 返回的 Futures 结果吗?

于 2013-01-24T21:10:26.797 回答