我有一堆Callable
s 我想并行运行并获得结果。我的机器上有 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()
,但我不明白这将如何导致它表现出奇怪的行为。
关于可能导致这种情况的任何想法?
编辑:这里没有区别。速度变慢是由于在进行此更改的同时对代码的不同部分进行了更改,并且两者之间存在混淆。