Последнее замечание с вашей стороны: «Я думаю, что основным моментом реактивности является эффективное использование потоков, и это то, о чем я спрашиваю». Именно для этого был разработан реактивный подход.
Так как же достигается эффективное использование?
В качестве примера, скажем, вы запрашиваете данные с сервера несколько раз.
Типичным нереактивным способом вы будете создавать / использовать несколько потоков (может быть из пула потоков) для каждого из ваших запросов. И работа одного конкретного потока состоит только в том, чтобы обслуживать этот конкретный запрос. Поток примет запрос, передаст его серверу и дождется его ответа, пока данные не будут получены с сервера, а затем вернет эти данные клиенту.
Теперь реактивным способом, когда есть запрос, для него будет выделен поток. Теперь, если появится другой запрос, создание другого потока не будет, скорее он будет обслуживаться тем же потоком. Как?
Когда поток принимает запрос к серверу, он не будет ждать немедленного ответа от сервера, скорее он вернется и будет обслуживать другой запрос.
Теперь, когда сервер ищет данные, и они доступны на сервере, возникает событие, а затем поток переходит к получению этих данных. Это называется механизмом Event-loop, поскольку вся работа по вызову потока, когда данные доступны, достигается путем вызова события.
Теперь с этим связана сложность для точного отображения ответа на запросы.
И все эти сложности абстрагируются Spring-Webflux (на Java).
Таким образом, весь процесс становится неблокирующим. А поскольку для обслуживания всех запросов достаточно одного потока, переключение потоков не будет, у нас может быть один поток на ядро ЦП. Таким образом достигается эффективное использование потоков.
Несколько изображений в сети, чтобы помочь вам понять: -> ![enter image description here](https://i.stack.imgur.com/HE70S.png)
![enter image description here](https://i.stack.imgur.com/SnCtY.png)
![enter image description here](https://i.stack.imgur.com/tu1y8.png)
![enter image description here](https://i.stack.imgur.com/wC1oV.png)