Spring 异步与线程池实战全解:失效原因、参数调优与 MQ 选型

很多后端同学在学习并发时都会经历三个阶段:

  1. @Async 用不起来
  2. 线程池参数不会调
  3. 不知道什么时候该用 MQ

如果你也卡在这三点,这篇文章就是为你准备的。

本文将从 实战工程视角,一文打通:

  • @Async 失效原因
  • 线程池参数调优
  • 线程池 vs MQ 选型思维

目标只有一句话:

不只是会用异步,而是理解"什么时候用、怎么用、用到什么程度"。

第一部分:@Async 为什么会失效?

这是 90% 初学者踩的坑。

1. 没有开启异步支持

错误:

java 复制代码
@SpringBootApplication
public class App {}

正确:

java 复制代码
@EnableAsync
@SpringBootApplication
public class App {}

2. 方法不是 public

Spring AOP 代理只能拦截 public 方法。

3. 同类内部调用

java 复制代码
this.sendEmail(); // 无效

必须通过 Spring 注入调用。

4. 默认线程池不可控

如果不自定义线程池:

  • 线程名混乱
  • 并发不可控
  • 容易打爆 CPU

5. 异常被吞掉

异步方法抛出的异常不会自动显示,需要日志或回调处理。

一句话总结:

@Async 不是魔法,本质是 AOP + 线程池。

第二部分:线程池参数怎么调?

线程池不是"越大越好"。

四个核心参数

参数 含义
coreSize 常驻线程
maxSize 最大线程
queueCapacity 排队容量
keepAlive 回收时间

通用经验值

CPU 密集型

java 复制代码
core = CPU 核心数 + 1

IO 密集型

java 复制代码
core = CPU × 2 ~ 3

拒绝策略选择

推荐:

java 复制代码
CallerRunsPolicy

含义:线程池满时让调用方执行,形成削峰。

线程池调优思维

不是凭感觉,而是:

  1. 压测
  2. 观察 CPU
  3. 观察队列堆积
  4. 微调参数

一句话总结:

线程池调优 = 压测 + 观察 + 调整。

第三部分:线程池 vs MQ 怎么选?

很多人会把两者混为一谈。

线程池的定位

适合:

  • 单服务内部并发
  • 写日志
  • 发邮件
  • 图片压缩

关键词:提速

MQ 的定位

适合:

  • 高并发注册
  • 秒杀
  • 订单系统
  • 削峰解耦

关键词:

注册场景拆解

同步主链路:

  • 参数校验
  • 唯一性校验
  • 写用户表

异步旁路:

  • 发短信
  • 发邮件
  • 发券
  • 写日志

一句话记忆:

线程池解决"快",MQ 解决"稳"。

最终总结

后端并发不是:

多开线程

而是:

合理调度资源 + 正确选型。

  1. @Async 解决"用"
  2. 线程池解决"稳"
  3. MQ 解决"系统级并发"

真正的后端工程能力,不在于 API 熟练度,

而在于:

知道什么时候用什么工具。

相关推荐
两年半的个人练习生^_^4 分钟前
每日一学:设计模式之原型模式
java·开发语言·设计模式·原型模式
biubiubiu07064 分钟前
Maven 父子工程 SpringBoot 多模块
java·spring boot·maven
elseif1235 分钟前
初学者必背【考点清单(大全)】【上篇】
开发语言·c++·笔记·学习·循环结构·分支结构·考纲
并不喜欢吃鱼6 分钟前
从零开始C++----二.(下篇)模版进阶与编译全过程的复习
开发语言·c++
23471021278 分钟前
4.17 学习笔记
开发语言·软件测试·笔记·python·学习
不知名的老吴23 分钟前
View的三大特性之一:迟绑定
开发语言·c++·算法
tumeng071124 分钟前
Spring详解
java·后端·spring
深邃-31 分钟前
【Web安全】-基础环境安装:虚拟机安装,JDK环境安装(1)
java·开发语言·计算机网络·安全·web安全·网络安全·安全架构
小雅痞32 分钟前
[Java][Leetcode hard] 135. 分发糖果
java·算法·leetcode
前端老石人33 分钟前
前端网站换肤功能的 3 种实现方案
开发语言·前端·css·html