У меня есть фрагмент кода, который работает в цикле, который я хотел бы распараллелить. Использование ExecutorService делает код очень быстрым, но я получаю несогласованные результаты, возможно, из-за состояния гонки. Есть ли еще одна параллель для цикла, которая работает быстро, как эта, и всегда совместима?Параллельный для Loop java имеет состояние гонки
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'? –