Применение потоков в java

Допустим есть задача с поиском суммы в списке. Решается элементарно

List<Integer> list = Arrays.asList(1,2,3);
int sum = list.stream().mapToInt(i -> i).sum();

Почему, если список содержит очень большое количество элементов, то эту задачу следует решать с применением потоков? Нет же никакой разницы, с тем, если это будет выполнятся в одном потоке


Ответы (1 шт):

Автор решения: Roman Konoval

Вероятно, вы неправильно представляете, как будет выглядеть параллельная версия этой задачи.

Работать это будет в общих чертах так:

  1. вначале нужно разделить задачу на части. В этом случае нужно поделить список, на части, которые будут обрабатываться потоками. (-)
  2. обработка частей в отдельных потоках параллельно: суммирование каждой части списка в отдельном потоке (+).
  3. слияние результатов параллельных потоков в финальный результат (-).

Факторы, которые делают алгоритм быстрее я пометил (+), а те, которые его замедляют - (-).

При достаточно большом списке выигрыш полученный за счет параллельной обработки на шаге 2 перевесит дополнительную работу (по сравнению с однопоточной версией) необходимую сделать на шагах 1 и 3.

Сбивать с толку еще может то, что в простом случае параллельная версия будет выглядеть очень похоже (но под капотом будет делать то, что описано выше):

list.parallelStream().mapToInt(i -> i).sum()
→ Ссылка