Collection.parallelStream()
Возвращает параллельный поток: элементы обрабатываются сразу в нескольких потоках выполнения.
Доступно с: Java 8
Синтаксис
default Stream<E> parallelStream()Возвращаемое значение
Stream<E>Поток, который может выполняться параллельно.
Примеры
Сумма квадратов — результат тот же, что у обычного потока:
void main() {
List<Integer> numbers = IntStream.rangeClosed(1, 1_000).boxed().toList();
long sum = numbers.parallelStream()
.mapToLong(n -> (long) n * n)
.sum();
IO.println(sum);
}Результат:
333833500Порядок forEach() в параллельном потоке непредсказуем; forEachOrdered() сохраняет его:
void main() {
List<Integer> list = List.of(1, 2, 3, 4, 5);
list.parallelStream().forEach(n -> IO.print(n + " "));
IO.println("");
list.parallelStream().forEachOrdered(n -> IO.print(n + " "));
IO.println("");
}Результат:
2 5 3 4 1
1 2 3 4 5Примечания
Параллельные потоки используют общий пул ForkJoinPool.commonPool() с числом потоков около числа ядер. Выигрыш бывает только на больших объёмах и тяжёлых вычислениях; для маленьких списков и ввода-вывода параллельный поток обычно медленнее. Нельзя менять общие переменные и обычные коллекции из лямбды — собирайте результат через collect(), reduce() или sum(). Обычный поток делают параллельным методом parallel().
См. также
- Collection.stream() — Создаёт поток (Stream) из элементов коллекции.
- Stream.forEach() — Выполняет действие для каждого элемента потока (завершающая операция).
- Stream.reduce() — Сворачивает все элементы потока в одно значение.
- ExecutorService — Сервис, который выполняет задачи в пуле потоков.
В учебнике
- Параллельные потоки — parallelStream и parallel в Java: как поток данных делится между ядрами процессора, когда это ускоряет работу, порядок и forEachOrdered, опасность общего изменяемого состояния.