Как потоки участвуют в обработке потока?
Вам решать.Используйте publishOn
или subscribeOn
, чтобы перейти от выполнения части конвейера к другой Thread
(как представлено абстракцией Scheduler
).Или используйте операторы, связанные со временем: по умолчанию они работают в планировщике Schedulers.parallel()
и могут быть точно настроены.Любой другой оператор (у которого нет переопределения, которое принимает Scheduler
) работает с тем же Thread
, которому он получил свои данные (сигнал onNext
) от.
Может подписчикиодин поток будет выполняться несколькими потоками?
Не совсем: согласно Reactive Streams
спецификации onNext
события должны быть последовательными и НЕ ДОЛЖНЫ происходить параллельно.Flux#parallel(n).runOn(Scheduler)
вводит явное исключение из этого правила.
Можно ли инициировать событие завершения до того, как все подписчики завершат обработку последнего элемента?
Каждый «подписчик» (вызовsubscribe
, block*
) видит и генерирует свой «поток».Таким образом, в отношении лямбды, которую вы передаете subscribe
, onComplete
никогда не выполняется до или одновременно с onNext
потребителем.
Единственное исключение, если у вас есть "горячий"Источник, который воспроизводит одни и те же события всем своим подписчикам.В этом случае поздние подписчики будут видеть только элементы, которые были выпущены после того, как они вошли (и если такой подписчик подпишется ПОСЛЕ того, как первоначальная последовательность завершена, то он увидит НЕТ onNext
и сразу же onComplete
).