RxJava vs Java 8 Parallelism Поток

Каковы все сходства и различия между ними. Похоже, что Java Parallel Stream имеет некоторый элемент, доступный в RXJava, верно?

Ответ 1

Rx - это API для создания и обработки наблюдаемых последовательностей. API Streams предназначен для обработки повторяющихся последовательностей. Rx-последовательности push-based; вы получаете уведомление, когда элемент доступен. Поток натягивается; он "запрашивает" для обработки элементов. Они могут казаться похожими, потому что они поддерживают аналогичные операторы/преобразования, но механики являются по существу противоположностями друг от друга.

Ответ 2

Существует также разница в потоковом использовании.

Параметр stream # parallel разбивает последовательность на части, и каждая часть обрабатывается в отдельном потоке.

Наблюдаемые # subscribeOn и Observable # observOn выполняются как "перемещение" в другой поток, но не разделяют последовательность.

Другими словами, для любого конкретного этапа обработки:

  • parallel Stream может обрабатывать разные элементы в разных потоках.
  • Наблюдаемый будет использовать один поток для сцены

Е. г. у нас есть Observable/Stream из многих элементов и двух этапов обработки:

Observable.create(...)
    .observeOn(Schedulers.io())
    .map(x -> stage1(x))
    .observeOn(Schedulers.io())
    .map(y -> stage2(y))
    .forEach(...);

Stream.generate(...)
    .parallel()
    .map(x -> stage1(x))
    .map(y -> stage2(y))
    .forEach(...);

Наблюдаемый будет использовать не более двух потоков (по одному на каждую стадию), так что к двум нитям x'es или y доступны разные потоки. Поток, напр., Может охватывать каждый этап по нескольким потокам.

Ответ 3

Поток основан на нагрузке. Лично я считаю, что Oracle отвечает на С# IEnumerable < > , LINQ и связанные с ними методы расширения.

RxJava основан на push, и я не уверен, выпущены ли они .NET реактивные расширения, или проект Rx начинается в прямом эфире.

Концептуально они совершенно разные, и их приложения также различны.

Если вы реализуете программу текстового поиска в текстовом файле, который настолько велик, что вы не можете загружать все и вписываться в память, вы, вероятно, захотите использовать Stream, так как вы можете легко определить, есть ли у вас следующие строки, отслеживание вашего итератора и сканирование по строкам.

Еще одно приложение Stream - это параллельные вычисления в наборе данных. В настоящее время каждая машина имеет несколько ядер, но вы точно не знаете, сколько ядер вашей клиентской машины доступно. Было бы сложно предварительно настроить количество потоков для работы. Таким образом, мы используем параллельный поток и позволяем JVM определить, что для нас (предположительно более оптимальное).

С другой стороны, если вы реализуете программу, которая берет строку ввода пользователя и ищет доступные видео в Интернете, вы будете использовать RX, так как вы даже не знаете, когда программа начнет получать какие-либо результаты (или получить ошибку сетевого таймаута). Чтобы ваша программа реагировала, вы должны позволить программе "подписаться" на сетевые обновления и полные сигналы.

Другим распространенным приложением Rx является GUI, чтобы "обнаружить пользовательский вход", не требуя, чтобы пользователь нажал кнопку для подтверждения. Например, вы хотите иметь текстовое поле всякий раз, когда пользователь перестает печатать, вы начинаете поиск, не ожидая нажатия кнопки "Поиск". В этом случае вы используете Rx для создания наблюдаемого на "KeyEvent" и "throttle" (например, на 500 мс), так что всякий раз, когда он прекратил печатать на 500 мс, вы получите onNext(), чтобы "начать поиск".