Flux.create(emitter -> {
for (int i = 0; i <= 5; i++) {
if (emitter.isCancelled()) {
return;
}
System.out.println(Thread.currentThread().getName() + ":Source created " + i);
emitter.next(i);
}
}).doOnNext(s -> {
System.out.println(Thread.currentThread().getName() + ":Source pushed " + s);
}).publishOn(Schedulers.parallel())
.subscribe(custer -> {
System.out.println(Thread.currentThread().getName() + ":consume " + custer);
});
执行结果:
main:Source created 0
main:Source pushed 0
main:Source created 1
parallel-1:consume 0
main:Source pushed 1
main:Source created 2
parallel-1:consume 1
main:Source pushed 2
main:Source created 3
main:Source pushed 3
main:Source created 4
main:Source pushed 4
main:Source created 5
main:Source pushed 5
parallel-1:consume 2
parallel-1:consume 3
parallel-1:consume 4
parallel-1:consume 5
从执行结果可以看出: publishOn之前的操作仍然是同步的,publishOn之后的操作变成了异步,且线程使用了parallel-1.
下面重点研究下PublishOnSubscriber的源码,根据本节及之前的源码,我们发现FluxPublishOn,FluxPeek,FluxFilter等中间层生产者类都会在内部提供一个内部类,如PublishOnSubscriber,这个类一般扮演双重角色,即兼职消费者和订阅关系,主要的核心逻辑都在此内部类中实现。而FluxArray,FluxCreate等sourceproducer则会提供一个内部类&#