2016-11-10 3 views
0

У меня есть фрагмент кода, который работает в цикле, который я хотел бы распараллелить. Использование 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(); 
     } 
+2

Не существует должен быть 'exec.submit()' в там где-нибудь? –

+0

Не знаете, почему это не копировало добавленные (спасибо) –

+0

являются 'bestLen' и' bestTour', используя 'synchronized'? –

ответ

0

Как я бы это делать тяжелую обработку в фоновом потоке, загружать, что в HashMap<String, Double>, чтобы избежать проблем параллелизма. (тур, len1)

Затем перебирать эту карту, с Еогеасп лямбда hashmap.foreach((k,v) -> /*comparison here*/);

Примечание:

Хотя я упоминал синхронизируется выше, для этого вопроса я сомневаюсь, что это поможет, потому что, Вы не можете сравнивать данные по данным, которые у вас пока нет.

Источник: How to for each the hashmap?

Смежные вопросы