news 2026/9/24 2:08:40

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/9/23 9:03:59

Web学习之网络通信

一、网络通信 互联网中主机和主机连接必须遵守待定的要求,这个要求成为协议OSI(Open System Interconnection)开放式系统互联,定义了计算机互联时网络通信的7层目前大规模使用的是TCP/IP协议 应用层 合并OSI中5,6&…

作者头像 李华
网站建设 2026/9/23 6:21:29

【软件测试】1_性能测试实战 _商城项目介绍

文章目录 一、轻商城项目介绍1.1 背景1.2 技术介绍 二、 项目功能架构三、 项目技术架构四、熟悉数据库设计4.1 查看表与表 之间的关联关系4.1.1 法一:用navicate 查看 设计表4.1.2 法二:用show create table 表名;sql语句 查看 表设计信息 4…

作者头像 李华
网站建设 2026/9/20 17:29:58

【CTF Writeup】Crypto题型之AES加密算法破解与实战

前言 一、AES-CBC模式原理 AES-CBC模式需满足: 加密前需对明文进行分组(每组16字节),不足则填充; 需要一个密钥key(16/24/32字节,对应AES-128/192/256)和初始化向量IV&#xff08…

作者头像 李华
网站建设 2026/9/22 15:16:31

2000亿美元!2026年全球游戏行业的新格局与新变量

2000亿美元!2026年全球游戏行业的新格局与新变量 2026年,全球游戏市场规模预计突破2000亿美元(约2050-2100亿美元),从2025年的1888-1970亿美元增长3-7%。 这标志着后疫情低迷期的复苏(增长率从2022-2024的…

作者头像 李华
网站建设 2026/9/20 17:27:34

鸿蒙APP开发从入门到精通:ArkUI组件库详解与常用组件实战

鸿蒙APP开发从入门到精通:ArkUI组件库详解与常用组件实战 鸿蒙(HarmonyOS NEXT)是华为推出的分布式操作系统,其APP开发框架以ArkUI为核心,采用ArkTS(基于TypeScript的扩展语言)进行声明式开发。…

作者头像 李华