Reactor по умолчанию не применяет модель параллелизма, и да, многие операторы продолжат работу на Thread
, где произошла операция subscribe()
.
Но это не значит, что использование Reactor заблокирует основной поток. Пример, который вы показываете, выполняет работу в памяти, без учета ввода-вывода или задержки. Также сразу подписывается на результат.
Вы можете попробовать следующий фрагмент и увидеть что-то другое:
Flux.range(1, 5)
.delayElements(Duration.ofMillis(100))
.log()
.subscribe(System.out::println);
System.out.println("End of Execution");
В логах я вижу:
INFO --- [main] reactor.Flux.ConcatMap.1 : onSubscribe(FluxConcatMap.ConcatMapImmediate)
INFO --- [main] reactor.Flux.ConcatMap.1 : request(unbounded)
End of Execution
В этом случае задерживающие элементы будут планировать работу по-другому - и поскольку ничто здесь не поддерживает работу JVM, приложение завершается, и ни один элемент из диапазона не используется.
В более распространенном сценарии будут задействованы операции ввода-вывода и задержки, и эта работа будет планироваться соответствующим образом и не будет блокировать основной поток приложения.