【发布时间】:2017-03-24 19:22:00
【问题描述】:
我有一段代码在我想并行化的循环中运行。 ExecutorService 的使用使代码非常快,但我得到的结果不一致,可能是由于竞争条件。是否有另一个并行的 for 循环可以像这个一样快速运行并且始终保持一致?
ExecutorService exec = Executors.newFixedThreadPool(8);
try{
for (String tour : tours)
{
if (valid)
{
exec.submit(() ->
{
double len1 = tsp.tourLen(tour, cities); //expensive sequentially
if (bestLen == -1 || len1 < bestLen)
{
bestLen = len1;
bestTour = tour;
}
});
}
}
System.out.println("\n Best tour len: " + bestLen);
System.out.println("\n Best tour: " + bestTour);
} finally
{
exec.shutdown();
}
【问题讨论】:
-
那里不应该有
exec.submit()的电话吗? -
不知道为什么没有复制添加(谢谢)
-
是
bestLen和bestTour使用synchronized? -
不,你能告诉我这将如何实现吗?
-
请参阅下面的答案,我会假设您的函数结果没有按顺序排列。