Реактивное программирование в Java глубокое понимание - PullRequest
0 голосов
/ 06 ноября 2018

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

То, что я не получаю, это:

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

Мой вопрос:

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

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

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

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

1 Ответ

0 голосов
/ 06 ноября 2018

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

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

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

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

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

...