Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Справочник Java

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, опасность общего изменяемого состояния.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.