用生活中最常见的例子拆解Java中超重要的——多线程(一)

前言:

多线程作为Java中超级超级重要的一个知识,

  • 网页浏览器:当你打开一个网页浏览器时,它可能会同时下载图片、播放视频、显示文字和更新广告。所有这些任务几乎都是同时进行的,这就是多线程在起作用。(你做前端开发网页需要多线程)

  • 游戏:在玩游戏时,画面需要不断更新,音乐要持续播放,同时还要响应你的键盘或鼠标输入。多线程可以让游戏中的这些不同元素流畅地运行。(你做游戏开发也需要多线程,比如说“王者荣耀中多个人物的不同动作,同时进行.....”)

  • 手机应用:比如你在使用地图导航时,应用程序不仅需要显示当前位置,还要接收GPS数据、搜索路线、提供语音指导等。多线程帮助应用同时处理这些任务,而不会让你觉得卡顿。(你做手机端的小程序也好还是软件也好,都需要多线程)

  • 服务器:当一个网站有很多人同时访问时,服务器会为每一个请求创建一个新的线程来处理,这样即使有很多人在同一时间访问,每个人都能得到快速的响应。(实际中你做后端数据的服务器也需要多线程,来提高效率)

而多线程的相关概念特别多,也有时候很抽象难懂。所以,咱们第一次先着重给大家拆解清楚这些重要的概念。相信一定会对大家有帮助的!!!

开始之前,大家可不可以给小编一个免费的赞或者关注我们一起进步啊!!!!



概述:

1.1程序、进程与线程

1. 程序(Program)


官方定义:

  • 程序是一组用某种编程语言编写的指令集合,它描述了计算机应该如何执行特定的任务。程序是静态的,也就是说它是保存在磁盘上的文件,直到被加载到内存中运行。

大白话拆解:

  • 程序就像一本食谱。里面写满了如何做一道菜的步骤,比如怎么做蛋糕。但是,这本食谱只是纸上的文字,不会自己去做蛋糕。它需要有人按照上面的指示一步步来操作才能做出实际的蛋糕。

举个栗子:

  • 你下载的微信安装包就是一个程序。它包含了启动聊天软件所需的所有信息,但直到你双击图标启动它之前,它只是一个静止不动的文件。

2. 进程(Process)


官方定义:

  • 进程是程序的一次执行实例,是操作系统进行资源分配和调度的基本单位。每个进程都有自己的独立内存空间,包括代码、数据、堆栈等,并且有自己的生命周期,从创建到终止。

大白话拆解:

  • 当厨师根据食谱开始做蛋糕时,这个过程就是“进程”。此时,厨师正在使用厨房里的工具(如烤箱、搅拌机等),这些工具就像是计算机的资源(如CPU、内存)。每次厨师根据食谱制作蛋糕都是一个独立的过程,即使使用同样的食谱,每一次制作都是一次新的进程。

举个栗子:

  • 当你打开微信聊天软件时,就创建了一个进程。这个进程中包含了所有你需要用来聊天的功能,比如发送消息、接收图片、语音通话等。即使你关闭了微信再重新打开,这也算是一个新的进程,因为它会重新加载所有的资源。

3. 线程(Thread)


官方定义:

  • 线程是进程中的一个执行单元,是操作系统能够进行运算调度的最小单位。一个进程可以包含多个线程,它们共享进程的资源,但每个线程有自己独立的执行路径。多线程允许在一个进程中同时执行多个任务,提高程序的响应速度和效率。

大白话拆解:

  • 如果把做蛋糕比作一个进程,那么线程就像是厨师在做蛋糕过程中所做的不同任务。例如,厨师可以一边搅拌面糊,一边预热烤箱,还可以同时准备装饰材料。这些都是同一进程(做蛋糕)下的不同线程,它们几乎同时进行,提高了工作的效率。

举个栗子:

  • 在微信聊天软件中,你可以同时发送消息、接收好友的视频请求、下载文件等。每一个这样的任务都可以看作是一个线程,它们都在同一个微信进程内工作,让整个聊天体验更加流畅。

为了大家好理解,咱们弄个图解:

+---------------------+
|   操作系统 (OS)      |
| +-----------------+ |
| |  进程 (Process)  | |
| | +-------------+ | |
| | | 线程 (Thread)| | |
| | +-------------+ | |
| | +-------------+ | |
| | | 线程 (Thread)| | |
| | +-------------+ | |
| +-----------------+ |
+---------------------+

操作系统 (OS) - 你的厨房

  • 操作系统就像是一间大厨房。在这个厨房里,你可以做很多事情,比如烹饪、洗碗、清洁等。它提供了所有必要的工具和空间来完成这些任务。
  • 操作系统管理着所有的资源,比如CPU(炉灶)、内存(橱柜)和其他硬件设备(刀具、砧板等),确保一切都能有条不紊地运行。


进程 (Process) - 工作台上的制作过程

  • 在这个大厨房里,你可能有多个工作台,每个工作台都在进行一项不同的任务。例如,一个工作台在制作蛋糕,另一个工作台在准备沙拉,还有一个工作台在煮咖啡。
  • 每个工作台就是一个进程。当你启动一个程序(比如QQ聊天软件),就相当于在厨房里设立了一个新的工作台,专门用来处理与这个程序相关的所有事情。每个进程都有自己的“工具”和“食材”,即它们有自己的内存空间和资源。


线程 (Thread) - 工作台上的具体任务

  • 在每个工作台上,厨师会执行多个具体的任务。例如,在制作蛋糕的工作台上,厨师可能一边搅拌面糊,一边预热烤箱,同时还准备装饰材料。这些都是同一项工作(制作蛋糕)下的不同小任务。
  • 每个小任务就是一条线程。线程是进程中最小的执行单位,它们共享同一个工作台(进程)的资源,但各自负责不同的具体任务。通过多线程,厨师可以在同一时间完成多项任务,大大提高了工作效率。


总结

  • 操作系统就像一间大厨房,它管理和协调所有的资源。
  • 进程就像是厨房里的一个个工作台,每个工作台专注于完成一项特定的任务。
  • 线程则是工作台上厨师执行的具体小任务,多个线程可以让厨师在同一时间完成多项任务,提高效率。

1.2 查看进程和线程

我们可以在电脑底部任务栏,右键----->打开任务管理器,可以查看当前任务 的进程:

如何查看进程:

1. 每个应用程序的运行都是一个进程


Windows:

  1. 打开“任务管理器”(可以通过右键点击任务栏并选择“任务管理器”或者按 Ctrl + Shift + Esc 快捷键)。
  2. 导航到“详细信息”选项卡。
  3. 启动一个应用程序(例如,记事本、浏览器等),你会看到一个新的进程出现在列表中。
    截图这个列表,确保可以看到新启动的应用程序对应的进程。


macOS:

  1. 打开“活动监视器”(可以在“应用程序” -> “实用工具”中找到)。
  2. 启动一个应用程序(例如,文本编辑器、Safari等),你会看到一个新的进程出现在列表中。
  3. 截图这个列表,确保可以看到新启动的应用程序对应的进程。
     

(因为小编是Windows电脑,苹果的无法展示)


2. 一个应用程序的多次运行,就是多个进程

Windows:

  1. 重复启动同一个应用程序多次(例如,打开多个记事本窗口)。
  2. 回到“任务管理器”的“详细信息”选项卡,你会看到有多个名为“notepad.exe”的进程。
  3. 截图显示这些进程的列表。

macOS:

  1. 重复启动同一个应用程序多次(例如,打开多个文本编辑器窗口)。
  2. 回到“活动监视器”,你会看到有多个名为“TextEdit”的进程。
  3. 截图显示这些进程的列表。

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逻辑。这样,每个线程都可以独立运行,简化了代码结构,也使得游戏更容易维护和扩展。

小编今天先讲到这里,我们下次再见!!!



1.5 补充概念

1.5.1 单核CPU和多核CPU

1.5.2 并行与并发

2.创建和启动线程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值