Flow API 只有四个接口,背压全靠 request(n) 这一个方法。这篇手写发布者与处理器,把「谁在哪个线程、什么时候发数据」打印出来。
Flow 的成员类型:[Processor(接口), Publisher(接口), Subscriber(接口), Subscription(接口)]
Flow 本身的方法个数:1;defaultBufferSize()=256
Processor:[] extends [Subscriber, Publisher]
Subscription:[cancel[], request[long]]
Subscriber:[onComplete[], onError[Throwable], onNext[Object], onSubscribe[Subscription]]
Publisher:[subscribe[Subscriber]] 场景 1:订阅者每次只 request(1),处理完一个再要下一个
[main ] onSubscribe
[main ] 收到 request(1)
[pub ] onNext(1)
[pub ] 收到 request(1)
[pub ] onNext(2)
[pub ] 收到 request(1)
[pub ] onNext(3)
[pub ] 收到 request(1)
[pub ] onNext(4)
[pub ] 收到 request(1)
[pub ] onNext(5)
[pub ] 收到 request(1)
[pub ] onComplete
场景 2:request(3) 一次,之后不再要
[main ] onSubscribe
[main ] 收到 request(3)
[pub ] onNext(1)
[pub ] onNext(2)
[pub ] onNext(3)
[main2 ] 300 ms 后仍没有 onComplete,取消
[main2 ] 收到 cancel()
场景 3:request(0)
[main ] onSubscribe
[main ] 收到 request(0)
[main ] onError java.lang.IllegalArgumentException: non-positive request
场景 4:request(Long.MAX_VALUE)(无界)
[main ] 收到 request(9223372036854775807)
[pub ] onNext(1)
[pub ] onNext(2)
[pub ] onNext(3)
[pub ] onNext(4)
[pub ] onNext(5)
[pub ] onComplete 处理器收到上游 onSubscribe
订阅者 onSubscribe,request(2)
处理器收到下游 request(2) → 转给上游
订阅者 onNext <10>
订阅者 onNext <20>
只 request 了 2,发 4 个,订阅者看到的见上;现在 close()