Parallelism и Flatmap в потоках Java 8

Привет, у меня вопрос о parallelism при использовании плоской карты Рассмотрим следующий пример

    IntStream.of(-1, 1).parallel().flatMap(i->IntStream.range(0,1000).parallel()).forEach(System.out::println);

Неважно, устанавливаю ли я внутренний флажок? Результаты выглядят очень схожими, если я оставлю это или нет. Также почему код (ReferencePipeline) упорядочивает отображение? Я запутался в строке:

result.sequential().forEach(downstream);

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/util/stream/ReferencePipeline.java#ReferencePipeline.flatMap%28java.util.function.Function%29

Ответ 1

В текущем JDK (jdk1.8.0_25) ответ отрицательный, не имеет значения, вы устанавливаете внутренний флаг в параллель, потому что даже вы его установили, .flatMap() вернула поток в последовательный здесь:

result.sequential().forEach(downstream);

( "result" - это внутренний поток, а последовательный() метод doc говорит: Возвращает эквивалентный поток, который является последовательным. Может вернуться сама, потому что поток уже был последовательным или потому, что состояние базового потока было изменено, чтобы быть последовательным.)

В большинстве случаев может быть без усилий, чтобы внутренний поток был параллельным; если внешний поток имеет по крайней мере то же количество элементов, что и количество потоков, которые могут выполняться параллельно (ForkJoinPool.commonPool(). getParallelism() = 3 на моем компьютере).