Чтобы иметь глубокое понимание реактивного программирования, я пытался очень простым способом переопределить класс RxJava Observable. Это заставило меня задать несколько важных вопросов о подходе реактивного программирования. Я хочу поделиться ими с вами.
Чего я не понимаю:
в реактивном программировании используются обратные вызовы, а затем тяжелые и асинхронные операции выполняются рабочим потоком (а не основным потоком) нашего приложения. Этот рабочий поток ждет для операции ввода-вывода, обработки и т. д., И когда он завершается, он вызывает вызывающего абонента через метод обратного вызова. Преимущество может заключаться в том, что основной поток не должен блокироваться, чтобы дождаться ответа обработки, потому что он асинхронный и потому что он вызывается, когда процесс завершается.
У меня вопрос:
в чем преимущество многопоточности перед простой? Я имею в виду в многопоточности нет обратного вызова, поэтому рабочий поток не вызывает обратно основной поток, в любом случае он возвращает результат вызывающей стороне (например, используя Callable).
В обоих этих двух сценариях один рабочий поток блокируется, чтобы дождаться операций ввода-вывода или обработки.
Единственная разница - это обратный вызов вместо возврата.
Так что мне не хватает?




"реактивное программирование использует обратные вызовы"
не совсем. Это асинхронное программирование, которое использует обратные вызовы, а реактивное программирование - это особый случай асинхронного программирования. Собственно, ваш вопрос касается асинхронного программирования в целом и не касается особенностей реактивного программирования.
Когда поток запущен, он чередуется между активным и блокирующим состояниями. В обоих состояниях поток занимает большой объем памяти для своего стека вызовов. Предполагается, что асинхронная процедура использует поток (и стек) только в активном состоянии и не блокирует какой-либо поток в его заблокированном состоянии. Это единственное отличие и главное преимущество асинхронного программирования.
Но нельзя предотвратить выполнение асинхронной процедурой операции блокировки, например блокирующий ввод-вывод или Semaphore.aquire (). В этом случае асинхронное программирование становится многопоточным и теряет свои преимущества.
Искусство асинхронного программирования - по возможности избегать блокирования операций. Если, тем не менее, программа выполняет блокирующие операции, проблема не в асинхронном программировании, а в квалификации программиста или в плохой среде, например отсутствие асинхронных драйверов JDBC.