Java 9 Flow API 是轻量级响应式流接口规范实现,聚焦发布-订阅、背压控制与信号协调,而非状态管理;它不提供 getValue/setValue 等变量操作,仅承诺按背压规则通知新数据项。

Java 9 的 Flow API 不是“响应式变量处理库”,它不提供类似 RxJava 的 BehaviorSubject 或 Reactor 的 Mono/Flux 那样的状态封装或变量抽象。它是一套轻量级、标准化的**响应式流接口规范实现**,聚焦于异步数据流的发布-订阅、背压控制与信号协调,而非管理可变状态。
Flow API 的真实定位:流控协议,不是状态容器
Flow.Publisher、Flow.Subscriber、Flow.Subscription 和 Flow.Processor 是对 Reactive Streams 规范的 1:1 接口映射,不带默认行为,也不封装变量生命周期。它不支持“监听一个值的变化”或“获取当前值”这类操作——它只承诺“当有新数据项到达时,按背压规则通知你”。
- 没有
getValue()、setValue()或asObservable()这类方法 - 无法直接替代
AtomicReference+ 手动通知,或PropertyChangeListener模式 - 若需“响应式变量”,需在
SubmissionPublisher基础上自行封装(例如每次 set 时调用submit())
SubmissionPublisher 是最常用的“起点”,但需手动驱动
java.util.concurrent.SubmissionPublisher 是 JDK 提供的唯一开箱即用的 Publisher 实现,适合做事件源或数据发射器,但它本身不维护状态,也不自动重发最新值。
- 它内部使用无界/有界
ForkJoinPool异步分发,但不保证顺序或重试 - 调用
submit(item)后,数据是否被消费,完全取决于下游Subscription.request(n)是否及时触发 - 常见误用:未在
onSubscribe()中立即调用request(1),导致第一个元素永远不发出
模拟“响应式变量”的最小可行封装
若业务确实需要类似 MutableLiveData 或 Subject 的能力,可基于 SubmissionPublisher 构建简易包装:
立即学习“Java免费学习笔记(深入)”;
- 用
AtomicReference<T>存当前值 - 暴露
update(T newValue)方法:先更新引用,再调用publisher.submit(newValue) - 提供
asPublisher()返回只读的Publisher<T>,避免下游误调submit - 注意线程安全:所有写操作应同步或使用原子操作,读操作可直接取
get()
何时该用 Flow,何时不该用
Flow API 适用于明确存在“生产者→消费者”数据流、且需精确控制吞吐与背压的场景,比如日志批量上报、传感器数据采集、消息中转桥接等。
- 适合:高并发异步管道、资源受限环境下的流控、与兼容 Reactive Streams 的中间件(如 R2DBC、Spring WebFlux 底层)对接
- 不适合:UI 状态绑定、配置热更新、简单回调通知——这些用
PropertyChangeSupport、CompletableFuture或轻量事件总线更直接 - 不推荐强行用 Flow 替代
Observer模式来管理单个变量,会增加复杂度且失去语义清晰性


















