Если мы используем ExecutorCompletionService, мы можем представить ряд задач как Callable и получить результат, взаимодействующий с CompletionService как queue,
Но есть и invokeAll of ExecutorService, который принимает задачи Collection, и мы получаем список Future для получения результатов.
Насколько я могу судить, нет никакой пользы в использовании одного или другого (за исключением того, что мы избегаем цикла for, используя invokeAll, который мы должны были бы submit выполнять задачи CompletionService) и, по сути, они являются одной и той же идеей с небольшой разницей.
Итак, почему существуют два разных способа представить ряд задач? Правильно ли я считаю, что производительность эквивалентна? Есть ли случай, когда он более подходит, чем другой? Я не могу думать об этом.