news 2026/6/15 17:23:00

Reactor线程池切换publishOn与subscribeOn

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Reactor线程池切换publishOn与subscribeOn

在 Reactor(Project Reactor)中,publishOnsubscribeOn是用于切换执行线程(调度器)的两个操作符,但它们的行为和用途截然不同。下面是它们的详细区别与使用说明。


🧠 一句话理解

  • **subscribeOn**:指定源(Publisher)创建 & 订阅逻辑运行在哪个线程。
  • **publishOn**:指定后续操作符运行在哪个线程(从当前开始切换)。

🔁 subscribeOn:影响订阅动作及其“上游”

Mono.fromCallable(()->{log.info("Generating value");return"Hello";}).subscribeOn(Schedulers.boundedElastic())// 👈 切换线程.map(v->{log.info("Mapping: {}",v);returnv.toUpperCase();});

📌 说明:

  • subscribeOn会影响:
    • 源数据的创建(如fromCallableMono.just
    • 源的订阅行为
    • 上游所有逻辑(在链条中靠前)

🧪 输出结果中的 log 会显示Generating valueMapping: xxx都在boundedElastic线程中执行。


🔀 publishOn:影响后续操作符

Mono.fromCallable(()->{log.info("Generating value");return"Hello";}).publishOn(Schedulers.parallel())// 👈 从这里切换线程.map(v->{log.info("Mapping: {}",v);returnv.toUpperCase();});

📌 说明:

  • publishOn只影响后续操作符的执行线程
  • 当前位置之后的操作符都在新的线程中执行
  • 当前位置之前的执行线程不会受影响

🧪 输出 log:

[main] Generating value [parallel-1] Mapping: Hello

⚠️ 两者配合使用

Mono.fromCallable(()->{log.info("Generating value");return"Hello";}).subscribeOn(Schedulers.boundedElastic()).publishOn(Schedulers.parallel()).map(v->{log.info("Mapping: {}",v);returnv.toUpperCase();});

🧪 输出 log:

[boundedElastic-1] Generating value [parallel-1] Mapping: Hello

🔍 总结对比表

特性subscribeOnpublishOn
生效位置整个流的最上游(首次调用生效)只影响之后的操作符
常用于指定数据源的线程(IO、慢操作)指定数据处理的线程
多次调用只有第一次调用有效(对源)可以多次调用,影响每一处之后
应用场景创建慢资源(数据库、文件等)控制不同阶段逻辑在不同线程
替代线程切换逻辑可以代替传统线程池包装异步逻辑用于流中间切线程做不同的隔离或调度

✅ 实践建议

  • 网络/IO/阻塞调用 ➜ 放在subscribeOn(Schedulers.boundedElastic())
  • 业务计算阶段 ➜ 用publishOn(Schedulers.parallel())来提高并发度
  • 不要滥用这两个操作符,频繁切线程反而会增加上下文切换成本

如你有具体的使用场景(如 Flux + WebClient、文件读取、Kafka 等),我可以针对场景详细分析。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/14 22:38:02

2026年1月DeepSeek优化服务商口碑TOP10:从技术到效果转化的选型

2026年,生成式引擎优化(GEO)行业迎来规模化发展机遇。据《2025中国AI商业服务白皮书》数据显示,GEO市场规模已突破128亿元,近三年复合增长率达到41.7%。《2024生成式AI搜索生态研究报告》指出,随着AI搜索技…

作者头像 李华
网站建设 2026/6/6 8:25:50

救命神器8个AI论文网站,专科生搞定毕业论文不求人!

救命神器8个AI论文网站,专科生搞定毕业论文不求人! 专科生的毕业论文救星,AI 工具正在改变写作方式 对于很多专科生来说,撰写毕业论文是一项既复杂又令人焦虑的任务。从选题到查资料,再到撰写和降重,每一…

作者头像 李华
网站建设 2026/6/15 12:15:09

【Django毕设源码分享】基于Python的毕业生去向反馈调查平台的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/6/10 0:42:51

ijkplayer相关实用链接

编译完成后导入项目使用: Android Studio引用ijkplayer - 简书

作者头像 李华
网站建设 2026/6/15 14:36:33

2025年商业邮件诈骗攻击趋势深度解析

BEC邮件趋势:2025年攻击量增长15% 商业邮件诈骗是一种复杂的网络钓鱼攻击,欺诈者冒充公司高管、员工和财务专业人员,旨在进行数据盗窃和金融诈骗。根据联邦调查局互联网犯罪投诉中心的报告,它仍然是造成损失最严重的网络攻击之一…

作者头像 李华
网站建设 2026/6/15 3:38:56

Spring MVC 请求参数处理全解析

Spring MVC 请求参数处理全解析(2025–2026 实用视角) Spring MVC 的请求参数处理是整个框架最核心、最常被问到的部分之一。 它决定了你能否优雅、安全、高效地接收前端(浏览器、Postman、移动端、OpenAPI 等)传来的各种形式数据…

作者头像 李华