前言:
多线程作为Java中超级超级重要的一个知识,
- 网页浏览器:当你打开一个网页浏览器时,它可能会同时下载图片、播放视频、显示文字和更新广告。所有这些任务几乎都是同时进行的,这就是多线程在起作用。(你做前端开发网页需要多线程)
- 游戏:在玩游戏时,画面需要不断更新,音乐要持续播放,同时还要响应你的键盘或鼠标输入。多线程可以让游戏中的这些不同元素流畅地运行。(你做游戏开发也需要多线程,比如说“王者荣耀中多个人物的不同动作,同时进行.....”)
- 手机应用:比如你在使用地图导航时,应用程序不仅需要显示当前位置,还要接收GPS数据、搜索路线、提供语音指导等。多线程帮助应用同时处理这些任务,而不会让你觉得卡顿。(你做手机端的小程序也好还是软件也好,都需要多线程)
- 服务器:当一个网站有很多人同时访问时,服务器会为每一个请求创建一个新的线程来处理,这样即使有很多人在同一时间访问,每个人都能得到快速的响应。(实际中你做后端数据的服务器也需要多线程,来提高效率)
而多线程的相关概念特别多,也有时候很抽象难懂。所以,咱们第一次先着重给大家拆解清楚这些重要的概念。相信一定会对大家有帮助的!!!
开始之前,大家可不可以给小编一个免费的赞或者关注(我们一起进步啊!!!!)
概述:
1.1程序、进程与线程
1. 程序(Program)
官方定义:
- 程序是一组用某种编程语言编写的指令集合,它描述了计算机应该如何执行特定的任务。程序是静态的,也就是说它是保存在磁盘上的文件,直到被加载到内存中运行。
大白话拆解:
- 程序就像一本食谱。里面写满了如何做一道菜的步骤,比如怎么做蛋糕。但是,这本食谱只是纸上的文字,不会自己去做蛋糕。它需要有人按照上面的指示一步步来操作才能做出实际的蛋糕。
举个栗子:
- 你下载的微信安装包就是一个程序。它包含了启动聊天软件所需的所有信息,但直到你双击图标启动它之前,它只是一个静止不动的文件。
2. 进程(Process)
官方定义:
- 进程是程序的一次执行实例,是操作系统进行资源分配和调度的基本单位。每个进程都有自己的独立内存空间,包括代码、数据、堆栈等,并且有自己的生命周期,从创建到终止。
大白话拆解:
- 当厨师根据食谱开始做蛋糕时,这个过程就是“进程”。此时,厨师正在使用厨房里的工具(如烤箱、搅拌机等),这些工具就像是计算机的资源(如CPU、内存)。每次厨师根据食谱制作蛋糕都是一个独立的过程,即使使用同样的食谱,每一次制作都是一次新的进程。
举个栗子:
- 当你打开微信聊天软件时,就创建了一个进程。这个进程中包含了所有你需要用来聊天的功能,比如发送消息、接收图片、语音通话等。即使你关闭了微信再重新打开,这也算是一个新的进程,因为它会重新加载所有的资源。
3. 线程(Thread)
官方定义:
- 线程是进程中的一个执行单元,是操作系统能够进行运算调度的最小单位。一个进程可以包含多个线程,它们共享进程的资源,但每个线程有自己独立的执行路径。多线程允许在一个进程中同时执行多个任务,提高程序的响应速度和效率。
大白话拆解:
- 如果把做蛋糕比作一个进程,那么线程就像是厨师在做蛋糕过程中所做的不同任务。例如,厨师可以一边搅拌面糊,一边预热烤箱,还可以同时准备装饰材料。这些都是同一进程(做蛋糕)下的不同线程,它们几乎同时进行,提高了工作的效率。
举个栗子:
- 在微信聊天软件中,你可以同时发送消息、接收好友的视频请求、下载文件等。每一个这样的任务都可以看作是一个线程,它们都在同一个微信进程内工作,让整个聊天体验更加流畅。
为了大家好理解,咱们弄个图解:
+---------------------+
| 操作系统 (OS) |
| +-----------------+ |
| | 进程 (Process) | |
| | +-------------+ | |
| | | 线程 (Thread)| | |
| | +-------------+ | |
| | +-------------+ | |
| | | 线程 (Thread)| | |
| | +-------------+ | |
| +-----------------+ |
+---------------------+
操作系统 (OS) - 你的厨房
- 操作系统就像是一间大厨房。在这个厨房里,你可以做很多事情,比如烹饪、洗碗、清洁等。它提供了所有必要的工具和空间来完成这些任务。
- 操作系统管理着所有的资源,比如CPU(炉灶)、内存(橱柜)和其他硬件设备(刀具、砧板等),确保一切都能有条不紊地运行。
进程 (Process) - 工作台上的制作过程
- 在这个大厨房里,你可能有多个工作台,每个工作台都在进行一项不同的任务。例如,一个工作台在制作蛋糕,另一个工作台在准备沙拉,还有一个工作台在煮咖啡。
- 每个工作台就是一个进程。当你启动一个程序(比如QQ聊天软件),就相当于在厨房里设立了一个新的工作台,专门用来处理与这个程序相关的所有事情。每个进程都有自己的“工具”和“食材”,即它们有自己的内存空间和资源。
线程 (Thread) - 工作台上的具体任务
- 在每个工作台上,厨师会执行多个具体的任务。例如,在制作蛋糕的工作台上,厨师可能一边搅拌面糊,一边预热烤箱,同时还准备装饰材料。这些都是同一项工作(制作蛋糕)下的不同小任务。
- 每个小任务就是一条线程。线程是进程中最小的执行单位,它们共享同一个工作台(进程)的资源,但各自负责不同的具体任务。通过多线程,厨师可以在同一时间完成多项任务,大大提高了工作效率。
总结
- 操作系统就像一间大厨房,它管理和协调所有的资源。
- 进程就像是厨房里的一个个工作台,每个工作台专注于完成一项特定的任务。
- 线程则是工作台上厨师执行的具体小任务,多个线程可以让厨师在同一时间完成多项任务,提高效率。
1.2 查看进程和线程
我们可以在电脑底部任务栏,右键----->打开任务管理器,可以查看当前任务 的进程:
如何查看进程:
1. 每个应用程序的运行都是一个进程
Windows:
- 打开“任务管理器”(可以通过右键点击任务栏并选择“任务管理器”或者按 Ctrl + Shift + Esc 快捷键)。
- 导航到“详细信息”选项卡。
- 启动一个应用程序(例如,记事本、浏览器等),你会看到一个新的进程出现在列表中。
截图这个列表,确保可以看到新启动的应用程序对应的进程。
macOS:
- 打开“活动监视器”(可以在“应用程序” -> “实用工具”中找到)。
- 启动一个应用程序(例如,文本编辑器、Safari等),你会看到一个新的进程出现在列表中。
- 截图这个列表,确保可以看到新启动的应用程序对应的进程。
(因为小编是Windows电脑,苹果的无法展示)
2. 一个应用程序的多次运行,就是多个进程
Windows:
- 重复启动同一个应用程序多次(例如,打开多个记事本窗口)。
- 回到“任务管理器”的“详细信息”选项卡,你会看到有多个名为“notepad.exe”的进程。
- 截图显示这些进程的列表。
macOS:
- 重复启动同一个应用程序多次(例如,打开多个文本编辑器窗口)。
- 回到“活动监视器”,你会看到有多个名为“TextEdit”的进程。
- 截图显示这些进程的列表。
1.3 线程调度
1. 分时调度
官方解释:
- 分时调度是一种CPU调度策略,其中所有线程轮流使用CPU的使用权,并且平均分配每个线程占用CPU的时间。这种调度方式确保了每个线程都能得到公平的处理时间,适用于需要保证所有任务都得到响应的场景,如多用户系统。
大白话拆解:
- 你们在玩一个传球游戏。每个人轮流接球并持球一段时间,然后把球传给下一个人。每个人都有平等的机会持球玩耍,没有人能长时间独占球。这样,每个人都能参与到游戏中来,不会有人被冷落。
举个栗子:
- 学校有一场接力赛跑。每个参赛者(线程)都要跑一段相同的距离(CPU时间),然后将接力棒(CPU使用权)传递给下一个参赛者。这样,每个参赛者都有机会跑步,而且每个人跑的距离是相同的。这就像分时调度,确保每个线程都能获得相等的CPU时间。
2. 抢占式调度
官方解释:
- 抢占式调度是一种CPU调度策略,其中优先级高的线程以较大的概率优先使用CPU。如果多个线程的优先级相同,那么会随机选择一个线程执行。Java使用的就是抢占式调度。这种调度方式可以提高系统的响应速度和效率,因为高优先级的任务可以更快地得到处理。
大白话拆解:
- 你和朋友们在一个游乐场排队玩过山车。如果你有一个“VIP通行证”(高优先级),你可以跳过队伍直接上车。而那些没有VIP通行证的人则需要按照顺序排队等待。如果有多个人都有VIP通行证,那么他们会随机决定谁先上车。这就是抢占式调度,优先级高的任务可以更快地获得CPU资源。
举个栗子:
- 你正在图书馆或者自习室做作业,同时你的手机不断收到消息通知。你会暂停写作业(低优先级任务)去查看和回复重要消息(高优先级任务)。一旦消息处理完毕,你再继续写作业。在这个过程中,重要消息得到了优先处理,而写作业这个任务虽然被中断了,但最终还是会被完成。这就像抢占式调度,重要的任务(高优先级线程)会优先获得CPU时间,而其他任务(低优先级线程)会在适当的时候继续执行。
总结:
- 分时调度:所有线程轮流使用CPU,每个人都得到公平的处理时间,就像大家轮流玩传球游戏或接力赛跑。
- 抢占式调度:优先级高的线程更有可能首先使用CPU,类似于拥有VIP通行证的人可以跳过队伍优先体验游乐设施。Java使用的就是这种调度方式,确保重要任务能够快速得到处理。
1.4 多线程程序的优点
1. 提高应用程序的响应
官方解释:
- 多线程可以确保应用程序的用户界面(UI)保持响应,即使后台正在进行复杂的计算或数据处理。通过将耗时的任务分配给独立的线程,主线程可以继续处理用户的输入和其他交互,从而提供更好的用户体验。
大白话拆解:
- 你在玩一个电脑游戏,同时游戏还在下载新的地图数据。如果只用一个线程,游戏会暂时停止,直到下载完成,这会让你觉得游戏卡住了。但是,如果使用多线程,游戏可以在后台下载新地图的同时继续流畅运行,你不会感觉到任何停顿或延迟。
举个栗子:
- 图形化界面应用:比如你正在使用文字处理软件写文档,而软件在后台自动保存文件。如果你点击“查找”功能来搜索某个词,这个操作不会因为自动保存而被中断。这是因为查找功能和自动保存是两个不同的线程,它们可以同时进行,互不干扰。
- 视频播放器:当你观看在线视频时,视频播放器可以在后台缓冲接下来的内容,同时你还可以调整音量、快进或暂停。这些操作都能流畅进行,因为你不会因为缓冲而感到卡顿。(你前脚点开一个爱奇艺,其他应用都卡的动不了了)
2. 提高计算机系统CPU的利用率
官方解释:
- 多线程可以更充分地利用CPU资源,尤其是在现代多核处理器中。即使是在单核CPU上,多线程也可以通过交替执行不同的任务来减少CPU空闲时间,从而提高整体效率。
大白话拆解:
- 一个厨师团队,每个厨师擅长不同的任务,比如切菜、煮汤、烤面包等。如果只有一个厨师做所有事情,他可能会在等待水烧开的时候无所事事。但是,如果有多个厨师同时工作,每个人都可以专注于自己的任务,整个厨房的工作效率会大大提高。
举个栗子:
- 浏览器:当你打开一个网页浏览器时,它可能会同时加载图片、播放视频、显示文字和更新广告。所有这些任务几乎都是同时进行的,这就是多线程在起作用。即使你的电脑只有一个CPU核心,浏览器也会通过快速切换不同的任务来充分利用CPU资源,让你感觉一切都很流畅。
- 编译器:当你编写代码并点击“编译”按钮时,编译器可以同时进行语法检查、优化代码和生成可执行文件。这些任务可以通过多线程并行处理,大大缩短了编译时间。
3. 改善程序结构
官方解释:
- 多线程编程可以使复杂的任务分解为多个独立的子任务,每个子任务由一个线程负责。这种模块化的设计使得程序更容易理解和维护,同时也提高了代码的可读性和可扩展性。
大白话拆解:
- 建造一座房子。如果你一个人从头到尾做所有的事情,不仅会非常复杂,还容易出错。但是,如果你把任务分解给不同的工人,比如木工负责框架、电工负责布线、水管工负责管道,那么每个人只需要专注于自己的部分,整个项目会更加有条理,也更容易管理。
举个栗子:
- 服务器应用程序:一个Web服务器需要处理来自多个用户的请求。它可以为每个请求创建一个新的线程,这样每个线程都负责处理一个用户的请求,而不会影响其他用户的体验。这种设计使得服务器能够高效地处理大量并发请求,同时也方便开发人员调试和优化每个线程的功能。
- 游戏开发:在游戏中,你可以将不同的任务分配给不同的线程,例如一个线程负责渲染图像,另一个线程负责处理玩家输入,还有一个线程负责AI逻辑。这样,每个线程都可以独立运行,简化了代码结构,也使得游戏更容易维护和扩展。
小编今天先讲到这里,我们下次再见!!!