Цикл по фьючерсам - стоит ли сначала проверять isDone? - PullRequest
0 голосов
/ 20 июня 2019

У меня есть список фьючерсов.

List<Future> futures = new ArrayList<Future>();

futures.add(task1());
futures.add(task2());

Есть ли разница между этими двумя подходами к получению результатов?

// Option 1
for (Future future : futures) {
  results.add(future.get());
}

// Option 2
boolean incompleteFound;
do {
 incompleteFound = false;
 for (Future future : futures) {
    if (!future.isDone()) {
      incompleteFound = true;
    }
 }
} while (incompleteFound);

for (Future future : futures) {
  results.add(future.get());
}

Я бы предположил, что в Option 1, пока вызов get блокируется, это не повлияет на обработку фьючерсов в фоновом режиме. Я прав в этом предположении?

Ответы [ 2 ]

3 голосов
/ 20 июня 2019

Правильно.Сделай первый.Ожидание результата одного будущего не повлияет ни на один из других (и даже на тот, на котором вы ждете).

Второй не только не нужен, но и супер расточителен.Вместо передачи ЦП другим потокам теперь у вас есть занятый цикл, который будет вращать ЦП, потребляющий циклы ЦП без всякой причины.

1 голос
/ 20 июня 2019

Да, это не повлияет, все будущие задачи выполняются параллельно в фоновом режиме. Ссылка: https://javarevisited.blogspot.com/2015/01/how-to-use-future-and-futuretask-in-Java.html#axzz5rLieL6lf

...