Применение потоков в java
Допустим есть задача с поиском суммы в списке. Решается элементарно
List<Integer> list = Arrays.asList(1,2,3);
int sum = list.stream().mapToInt(i -> i).sum();
Почему, если список содержит очень большое количество элементов, то эту задачу следует решать с применением потоков? Нет же никакой разницы, с тем, если это будет выполнятся в одном потоке
Ответы (1 шт):
Вероятно, вы неправильно представляете, как будет выглядеть параллельная версия этой задачи.
Работать это будет в общих чертах так:
- вначале нужно разделить задачу на части. В этом случае нужно поделить список, на части, которые будут обрабатываться потоками. (-)
- обработка частей в отдельных потоках параллельно: суммирование каждой части списка в отдельном потоке (+).
- слияние результатов параллельных потоков в финальный результат (-).
Факторы, которые делают алгоритм быстрее я пометил (+), а те, которые его замедляют - (-).
При достаточно большом списке выигрыш полученный за счет параллельной обработки на шаге 2 перевесит дополнительную работу (по сравнению с однопоточной версией) необходимую сделать на шагах 1 и 3.
Сбивать с толку еще может то, что в простом случае параллельная версия будет выглядеть очень похоже (но под капотом будет делать то, что описано выше):
list.parallelStream().mapToInt(i -> i).sum()