fixing bug 2005 ordering problem while still parallelizing

This commit is contained in:
Axel Uhl committed 2014-06-19 10:02:16 +02:00
1 parent 34c4e58e8a
commit 48a9b24d58
1 file changed
+6 -6
@@ -701,13 +701,13 @@ public abstract class AbstractSimpleLeaderboardImpl implements Leaderboard, Race
throws NoWindException { throws NoWindException {
final Map<RaceColumn, Map<Competitor, Double>> result = new LinkedHashMap<>(); final Map<RaceColumn, Map<Competitor, Double>> result = new LinkedHashMap<>();
List<RaceColumn> raceColumnsToConsider = new ArrayList<>(); List<RaceColumn> raceColumnsToConsider = new ArrayList<>();
List<Future<?>> futures = new ArrayList<>(); Map<RaceColumn, Future<Map<Competitor, Double>>> futures = new HashMap<>();
for (final RaceColumn raceColumn : getRaceColumns()) { for (final RaceColumn raceColumn : getRaceColumns()) {
raceColumnsToConsider.add(raceColumn); raceColumnsToConsider.add(raceColumn);
final Iterable<RaceColumn> finalRaceColumnsToConsider = new ArrayList<>(raceColumnsToConsider); final Iterable<RaceColumn> finalRaceColumnsToConsider = new ArrayList<>(raceColumnsToConsider);
futures.add(executor.submit(new Runnable() { futures.put(raceColumn, executor.submit(new Callable<Map<Competitor, Double>>() {
@Override @Override
public void run() { public Map<Competitor, Double> call() {
Map<Competitor, Double> totalPointsSumPerCompetitorInColumn = new HashMap<>(); Map<Competitor, Double> totalPointsSumPerCompetitorInColumn = new HashMap<>();
for (Competitor competitor : getCompetitors()) { for (Competitor competitor : getCompetitors()) {
try { try {
@@ -717,14 +717,14 @@ public abstract class AbstractSimpleLeaderboardImpl implements Leaderboard, Race
} }
} }
synchronized (result) { synchronized (result) {
result.put(raceColumn, totalPointsSumPerCompetitorInColumn); return totalPointsSumPerCompetitorInColumn;
} }
} }
})); }));
} }
for (Future<?> future : futures) { for (RaceColumn raceColumn : getRaceColumns()) {
try { try {
future.get(); result.put(raceColumn, futures.get(raceColumn).get());
} catch (InterruptedException | ExecutionException e) { } catch (InterruptedException | ExecutionException e) {
if (e.getCause() instanceof NoWindError) { if (e.getCause() instanceof NoWindError) {
throw ((NoWindError) e.getCause()).getCause(); throw ((NoWindError) e.getCause()).getCause();