在很多初学后端的人眼里:
并发 = 多开几个线程
线程多 = 性能高
但真实的企业系统恰恰相反:
线程乱开 = 系统崩溃
合理调度 = 稳定高并发
这一篇我们从工程视角,彻底讲清楚 线程池与异步体系在后端系统中的真实作用。
=================================================================
一、什么是并发?先破一个误区
很多人把"并发"理解为:
同时做很多事
但服务器真正的并发定义是:
在有限资源下,合理调度任务,让系统不崩。
并发不是"多",而是"稳"。
二、为什么不能随便 new Thread?
很多新手写法:
java
new Thread(() -> sendEmail()).start();
看起来很酷,但在高并发下会出现:
- 线程创建开销大
- CPU 上下文切换频繁
- 内存迅速膨胀
- 系统直接卡死
一句话:
线程是重资源,不能随便创建。
三、线程池是什么?
线程池的本质可以理解为:
一组常驻工人,而不是临时招人干活。
示意:
java
任务来了 → 放进池子 → 空闲线程处理
优点:
- 线程复用
- 控制并发数量
- 防止资源耗尽
- 提升系统稳定性
四、Java 线程池核心参数
最重要的四个参数:
| 参数 | 含义 |
|---|---|
| corePoolSize | 核心线程数(常驻员工) |
| maximumPoolSize | 最大线程数(顶峰扩容) |
| queueCapacity | 等待队列长度 |
| keepAliveTime | 空闲回收时间 |
理解一句话:
核心线程干活 → 队列排队 → 顶不住再扩容。
五、线程池最小使用示例
java
ExecutorService pool = Executors.newFixedThreadPool(5);
pool.submit(() -> {
System.out.println("发送邮件");
});
这样不会无限创建线程,而是复用已有线程。
六、什么是异步?
同步流程:
java
查数据库 → 发短信 → 写日志 → 返回结果
用户必须等全部完成。
异步流程:
java
查数据库 → 返回结果
├ 发短信(线程池)
└ 写日志(线程池)
用户体验瞬间提升。
七、SpringBoot 异步体系
Spring 提供了极简方式:
1. 开启支持
java
@EnableAsync
2. 使用注解
java
@Async
public void sendEmail() {
System.out.println("发送邮件");
}
Spring 自动交给线程池处理。
八、线程池 vs MQ(很多人混淆)
| 维度 | 线程池 | MQ |
|---|---|---|
| 范围 | 单服务内部 | 多服务之间 |
| 目标 | 提速 | 削峰/解耦 |
| 是否跨机器 | 否 | 是 |
| 是否排队 | 少量 | 大量 |
| 典型场景 | 写日志/发邮件 | 注册/下单高峰 |
记住一句:
线程池解决"快",MQ 解决"稳"。
九、真实企业中的应用场景
线程池常见用途:
- 写操作日志
- 异步通知
- 图片压缩
- 文件处理
- 报表生成
MQ 常见用途:
- 秒杀系统
- 注册高峰
- 订单解耦
- 延迟任务
十、这节课真正让你升级的点
你学完后不是"会写代码",而是开始理解:
- 为什么接口会慢
- 为什么服务器会崩
- 为什么要限流
- 为什么要排队
- 为什么要异步
这叫:
从写功能 → 设计系统
十一、达标标准(不用钻牛角尖)
你只需要做到:
- 会创建线程池
- 会使用
@Async - 知道核心参数意义
- 能解释同步 vs 异步
- 能说清线程池与 MQ 区别
不需要:
- JVM 源码级研究
- 自己实现线程池算法
十二、一句话总结
线程池是后端系统的"多任务发动机",
异步体系是后端系统的"时间调度器"。
下一篇: