2016-01-20 3 views
1

До официального выпуска Java 8, когда он все еще находился в разработке, я правильно понимаю, что синтаксис получения потоков и параллельных потоков был несколько иным. Теперь у нас есть возможность либо поговорке:синтаксис parralel stream до java 8 release

stream().parallel() или parallelStream()

Я помню, как читал учебники до его выхода, когда было тонкое различие здесь - может кто-нибудь напомнить о том, что это было, как это было давало мне покоя!

ответ

2

Текущая реализация не имеет никакого значения: .stream() создает конвейер с parallel набором поля для false, то .parallel() просто устанавливает это поле истины и возвращает тот же объект. При использовании .parallelStream() он создает конвейер с полем parallel, установленным в конструктор true. Таким образом, обе версии одинаковы. Любые последующие вызовы .parallel() или .sequential() просто делают то же самое: измените флаг режима потока на true или false и верните тот же объект.

Ранняя реализация Stream API была иной. Here's Исходный код AbstractPipeline (родительский для всех Stream, IntStream, LongStream и DoubleStream реализациях) в лямбда-dev незадолго до того, как была изменена логика. Установка режима на parallel() сразу после создания потока из разделителя была относительно дешевой: он просто извлекает spliterator из исходного потока (depth == 0 ветвь в spliteratorSupplier()), а затем создает новый поток в верхней части этого разделителя, отбрасывая исходный поток (те раз не было close()/onClose(), поэтому было необязательно делегировать тесные обработчики).

Тем не менее, если ваш источник потока включен промежуточные этапы (например, рассмотреть Collections.nCopies реализации, которая включает в себя map шага), вещи были хуже: с помощью .stream().parallel() бы create a new spliterator с бедным людьми стратегией расщепления (которая включает в себя буферизацию). Таким образом, для такой коллекции с использованием .parallelStream() было фактически лучше, так как оно использовалось внутренне .parallel()до промежуточная операция. В настоящее время даже для nCopies() вы можете использовать как .stream().parallel(), так и .parallelStream() взаимозаменяемо.

Идет еще больше назад, вы may notice, что .parallelStream() было вызвано просто .parallel() изначально. Он был переименован в this changeset.

+1

Но не было и небольшой разницы в синтаксисе - я помню, что читал что-то, что предполагало, что это было или было изменено для окончательной версии, так что вы могли бы вызвать collection.stream() или collection.parallel() и они изменили его на collection.parallelStream() и stream(). parallel(). Это всего лишь пример, но я думаю, что это было что-то вроде этого ... – Tranquility

+1

Ну, идя еще более назад, вы [можете заметить] (http://hg.openjdk.java.net/lambda/lambda/jdk/file /cbef342202eb/src/share/classes/java/util/Collection.java#l491), что '.parallelStream()' первоначально назывался '.parallel()', если вы спрашиваете об этом. Он был переименован в [этот набор изменений] (http://hg.openjdk.java.net/lambda/lambda/jdk/rev/e41e14b4470a). –

+0

Да, это было! Меня злило, поскольку я знал, что произошли перемены. Поэтому, когда он раньше назывался .parallel(), а не .parallelStream(), был ли еще stream(). Parallel(), то есть метод, который изменил последовательный поток, чтобы быть параллельным? Если это так, я думаю, именно поэтому они изменили его, поскольку в этом смысле был конфликт, и теперь это более очевидно. – Tranquility