2016-11-10 23 views
0

私は並列化したいループで動作するコードを持っています。 ExecutorServiceを使用するとコードが非常に高速になりますが、競合状態が原因で矛盾した結果が発生しています。このように速く動作し、常に一貫している別の並列forループがありますか?Parallel For 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

は 'synchronized'を使って' bestLen'と 'bestTour'ですか? –

答えて

0

私はこれを行うような方法は、バックグラウンドスレッドで重い処理を行うHashMap<String, Double>にそれをロードし、同時実行の問題を回避するためです。 (ツアー、LEN1)

が続いてforeachのラムダと、そのマップを反復hashmap.foreach((k,v) -> /*comparison here*/);

注:私はので、私はそれが役立つ疑うこの問題のために、上記同期言及したものの

まだ持っていないデータについては比較することはできません。

ソース: How to for each the hashmap?