Reactor3 源码解析六: FluxPublishOn源码剖析(1)

本文详细分析了Reactor3中FluxPublishOn操作符的工作原理,通过执行结果展示了publishOn前后的同步与异步变化。重点探讨了PublishOnSubscriber内部类的角色,它同时作为消费者和订阅关系,并在request方法中通过worker.schedule(this)实现异步调度。在run方法中,新线程从队列中拉取元素并传递给下游。onSubscribe方法不仅向下游传递订阅,还主动请求上游发送元素,解决被动发送源的问题。onNext方法则负责将上游元素存入队列并触发新线程消费。
摘要由CSDN通过智能技术生成
			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则会提供一个内部类&#

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值