Реактивное программирование на Java глубокое понимание

Чтобы иметь глубокое понимание реактивного программирования, я пытался очень простым способом переопределить класс RxJava Observable. Это заставило меня задать несколько важных вопросов о подходе реактивного программирования. Я хочу поделиться ими с вами.

Чего я не понимаю:

в реактивном программировании используются обратные вызовы, а затем тяжелые и асинхронные операции выполняются рабочим потоком (а не основным потоком) нашего приложения. Этот рабочий поток ждет для операции ввода-вывода, обработки и т. д., И когда он завершается, он вызывает вызывающего абонента через метод обратного вызова. Преимущество может заключаться в том, что основной поток не должен блокироваться, чтобы дождаться ответа обработки, потому что он асинхронный и потому что он вызывается, когда процесс завершается.

У меня вопрос:

в чем преимущество многопоточности перед простой? Я имею в виду в многопоточности нет обратного вызова, поэтому рабочий поток не вызывает обратно основной поток, в любом случае он возвращает результат вызывающей стороне (например, используя Callable).

В обоих этих двух сценариях один рабочий поток блокируется, чтобы дождаться операций ввода-вывода или обработки.

Единственная разница - это обратный вызов вместо возврата.

Так что мне не хватает?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
0
517
1

Ответы 1

"реактивное программирование использует обратные вызовы"

не совсем. Это асинхронное программирование, которое использует обратные вызовы, а реактивное программирование - это особый случай асинхронного программирования. Собственно, ваш вопрос касается асинхронного программирования в целом и не касается особенностей реактивного программирования.

Когда поток запущен, он чередуется между активным и блокирующим состояниями. В обоих состояниях поток занимает большой объем памяти для своего стека вызовов. Предполагается, что асинхронная процедура использует поток (и стек) только в активном состоянии и не блокирует какой-либо поток в его заблокированном состоянии. Это единственное отличие и главное преимущество асинхронного программирования.

Но нельзя предотвратить выполнение асинхронной процедурой операции блокировки, например блокирующий ввод-вывод или Semaphore.aquire (). В этом случае асинхронное программирование становится многопоточным и теряет свои преимущества.

Искусство асинхронного программирования - по возможности избегать блокирования операций. Если, тем не менее, программа выполняет блокирующие операции, проблема не в асинхронном программировании, а в квалификации программиста или в плохой среде, например отсутствие асинхронных драйверов JDBC.

Другие вопросы по теме