一、多线程
1. 区分进程与线程
进程(Process):可以理解为一个正在运行的程序实例。它是操作系统进行资源分配的基本单位,拥有独立的内存空间、文件描述符、系统资源等。
线程(Thread):是进程内部的一个执行单元,是操作系统进行任务调度的基本单位。一个进程可以包含多个线程,这些线程共享进程的资源。
| 特性 | 进程 | 线程 |
|---|---|---|
| 资源分配 | 操作系统分配资源的基本单位 | 操作系统调度执行的基本单位 |
| 内存空间 | 独立的地址空间,隔离性强 | 共享进程的地址空间 |
| 创建/销毁开销 | 大(需分配独立内存、文件句柄等) | 小(共享进程资源,只需独立栈和寄存器) |
| 通信方式 | 需要进程间通信(IPC)机制 | 直接读写共享内存(但需同步机制) |
| 崩溃影响 | 一个进程崩溃不影响其他进程 | 一个线程崩溃可能导致整个进程崩溃 |
| 切换开销 | 大(需切换整个进程上下文) | 小(只需切换线程上下文) |
🏢 进程 = 独立公司
👷 线程 = 公司内部的员工
2. 什么是多线程?
想象你正在开一家"奶茶店",这个店就是进程。而店里的员工就是线程。
多线程就是让你的奶茶店可以同时让多个员工(线程)一起工作,而不是只让一个人(单线程)忙得团团转。
从技术角度看:
多线程是指在一个程序中同时运行多个执行流(线程),这些线程共享进程的资源(如内存、文件),但各自有独立的执行路径。
就像你店里,一个员工在做奶茶(线程1),另一个在洗杯子(线程2),第三个在收银(线程3),大家同时工作,效率大大提高。
3. 多线程的作用
1️⃣ 提升效率,像"多手同时干活"
- 单线程:你一个人做奶茶,洗杯子,收银,忙得不可开交
- 多线程:三个人各司其职,同时完成多项任务
"多线程不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。"——《多线程百度百科》
2️⃣ 提升用户体验,告别"卡顿"
想象你在用手机APP点奶茶:
- 单线程:你点单后,整个APP都卡住了,等你点单完成才能继续用
- 多线程:点单操作在后台进行,你还能继续刷朋友圈、看视频
3️⃣ 充分利用多核CPU,像"多核处理器的超能力"
现代电脑CPU就像"多核处理器",多线程能让这些"核"都动起来,而不是只用一个核。
"CPU多线程技术可以为高速的运算核心准备更多的待处理数据,减少运算核心的闲置时间。"——《CPU多线程百度百科》
4. 多线程的典型应用场景
🧁 1. 后台异步任务(奶茶店的"自动续杯")
- 桌面应用:Word的自动保存(不用等保存完成就能继续打字)
- 移动App:图片上传、消息推送(上传图片时还能继续聊天)
- Web后端:发送邮件、短信(发邮件时还能处理其他请求)
"多线程可以将耗时的操作放在后台线程执行,不阻塞主线程。"
🌐 2. 高并发服务器(奶茶店的"千人排队")
- Web服务器:Tomcat、Nginx等处理大量用户请求
- 游戏服务器:同时服务成百上千个玩家
- 即时通讯:微信、QQ等应用处理大量消息
"一个主线程负责监听客户端连接,每当有新连接到来,就创建一个新线程专门处理这个客户端的请求。"
🎮 3. 实时游戏(奶茶店的"多任务处理")
- 一个线程处理用户输入(点单)
- 一个线程进行物理计算和逻辑更新(奶茶制作过程)
- 一个线程负责渲染画面(展示奶茶成品)
- 一个线程负责网络同步(与朋友分享奶茶)
"实时游戏需要多线程来实现流畅体验。"
📊 4. 并行计算(奶茶店的"批量制作")
- 大数据处理:Hadoop/Spark的MapReduce
- 科学计算:矩阵运算、模拟仿真
- 图像/视频处理:滤镜、编码
"将大任务拆分为小任务,分发给多个线程并行计算,最后汇总结果。"
⏰ 5. 定时任务(奶茶店的"自动补货")
- 监控系统:心跳检测
- 系统维护:定期清理临时文件
- 数据统计:报表生成
"使用ScheduledExecutorService可以方便地创建在特定时间延迟后或周期性执行的线程任务。"