news 2026/4/23 12:47:54

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/4/17 3:53:23

亲测好用10个AI论文网站,继续教育学生轻松搞定毕业论文!

亲测好用10个AI论文网站,继续教育学生轻松搞定毕业论文! AI 工具让论文写作不再难 在当前的学术环境中,越来越多的继续教育学生开始借助 AI 工具来提升论文写作效率。尤其是 AI 降重工具的出现,不仅有效降低了 AIGC 率&#xff…

作者头像 李华
网站建设 2026/4/18 16:02:00

一文掌握 Spring AI:集成主流大模型的完整方案与思考

一文掌握 Spring AI:集成主流大模型的完整方案与思考 Spring AI 是 Spring 生态中一个新兴的框架,旨在简化 Java/Spring Boot 应用与主流大语言模型(Large Language Models, LLM)的集成。它提供了一套统一的抽象接口,…

作者头像 李华
网站建设 2026/4/7 13:15:56

面了十几家公司测试岗,我终于悟了,面试无非就是这些题

测试岗的面试其实都是大同小异的,这里我收集整理了185道高频面试题,希望对在找工作或者准备跳槽的各位小伙伴有所帮助! 一. 测试基础 1.如何制定测试计划 参考答案: 测试计划包括测试目标、测试范围、测试环境的说明、测试类型…

作者头像 李华
网站建设 2026/4/8 22:32:57

Agent设计思路:从“智能”到“智慧”的企业级解决方案

一、设计背景与核心矛盾AI智能体的强大之处在于其基于大模型的任务分解、工具调用与自主规划能力。然而,这种基于概率生成的规划路径天然具有不确定性,难以满足企业对可预测结果、可审计轨迹和安全边界的需求。因此,JBoltAI的设计思路聚焦于如…

作者头像 李华
网站建设 2026/4/23 8:10:23

云上 + 私有化:Java 企业 AI 模型调用的双向适配方

在AI技术全面渗透企业数字化转型的今天,Java企业面临的核心命题已从“是否引入AI”转变为“如何选择适配业务的AI模型调用方案”。不同行业、不同规模的Java企业,因数据敏感性、运维能力、业务场景等差异,对AI模型的部署与调用有着截然不同的…

作者头像 李华
网站建设 2026/4/23 12:24:53

Java毕设选题推荐:基于SpringBoot+vue的乡村助农扶贫平台管理系统基于springboot的助农扶贫系统【附源码、mysql、文档、调试+代码讲解+全bao等】

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

作者头像 李华