
1. 先认识一下大背景进程Process要搞懂线程必须先知道“进程”。如果你在电脑上双击打开了微信又双击打开了QQ。在计算机眼里这就启动了两个“进程”。生活比喻你可以把“进程”想象成两家独立的餐厅。微信是一家专门做通讯的餐厅QQ是一家专门做社交的餐厅。两家餐厅互不干扰微信卡死了完全不影响QQ继续运行。2. 什么是线程Thread现在咱们把目光聚焦到其中一家餐厅比如微信这家餐厅。这家餐厅要运转需要做很多事情接收消息、发送朋友圈、加载图片、播放语音……如果全餐厅只有一个服务员或厨师他只能一件事一件事地干先收消息收完去发朋友圈发完再去加载图片。这就叫单线程。但如果这家餐厅里有好几个服务员或厨师他们可以同时干活。张三负责接客李四负责炒菜王五负责收银。他们虽然都在同一家餐厅里但各自做着不同的事。专业定义这就是线程线程是程序执行的最小单位。生活比喻线程就是餐厅里的“服务员”或“流水线”。总结一下关系进程是“餐厅”线程是“餐厅里的员工”。一家餐厅进程可以雇一个员工单线程也可以雇十个员工多线程。员工们共享这家餐厅的场地和食材。3. 生活中的“线程”硬核实战例子为了让你彻底弄懂咱们再看两个你每天都在经历的例子例子一用电脑边听歌边打游戏并发与上下文切换你在用电脑玩《英雄联盟》后台还开着网易云音乐放歌。单核CPU只有一个店长其实你的CPU处理器核心数往往不多它就像只有一个超级店长。店长非常忙他看一眼游戏操作角色放个技能马上切过去看一眼音乐播放器加载下一首歌。上下文切换因为店长切换速度太快了一秒钟切换几十亿次你感觉不到卡顿觉得游戏和音乐是“同时”进行的。这在计算机里叫“上下文切换”。例子二去银行办业务多线程的锁与排队一家银行进程开了 3 个窗口3个线程。共享资源3个窗口的柜员共用同一个厕所、同一台叫号机。死锁Deadlock如果窗口A的柜员拿着唯一的厕所钥匙去打印窗口B的柜员拿着唯一的打印纸去上厕所两人都不肯让步结果谁也办不成。这就是计算机里可怕的线程死锁。排队同步如果3个窗口同时想用同一台打印机系统就会说“排队”这就是线程锁。4. 为什么我们需要“多线程”如果单线程一个人干活也能把事干完为什么计算机非要多线程雇一堆人呢为了快提高效率下载一部电影单线程就像是只有一条水管在放水慢吞吞的。多线程就像是接了10条水管同时放水速度瞬间起飞。为了不卡防止界面假死假如你的Word文档是个单线程程序当你在疯狂打字时Word如果去执行“自动保存”保存需要几秒钟这个时候你按任何键它都不会理你假死。有了多线程一个线程专门管让你打字另一个线程在后台悄悄保存你完全没感觉。5. 员工线程越多越好吗既然是好事那软件是不是雇一万个线程越好绝对不是。管理成本增加一家小饭店如果雇了100个厨师厨房根本站不下光是互相避让的时间就够炒好几盘菜了。计算机也一样线程越多CPU光是决定“接下来该让谁干活”的调度成本就会剧增反而变慢。容易抢资源线程太多大家都去抢同一个网络、同一块内存容易造成冲突甚至互相把对方锁死。 给学生的“一句话通俗总结”程序是你手里的一本菜谱静态的。进程是你把这本菜谱拿去开了一家餐厅动态的占着场地和食材。线程是餐厅里跑堂传菜的服务员实际干活的。多线程就是雇了一群服务员让他们各司其职、默契配合让餐厅运转飞快同时还要防止他们因为抢工具而打架。希望这个“餐厅”的例子能让你在以后听到“多线程”、“并发编程”这些词的时候脑海里立刻浮现出一个热火朝天但又井井有条的后厨画面