您的位置 首页 java

“全栈2019”Java多线程第一章:多线程简介

难度

初级

学习时间

30分钟

适合人群

零基础

开发语言

Java

开发环境

  • JDK v11
  • IntelliJ IDEA v2018.3

友情提示

  • 本教学属于系列教学,内容具有连贯性,本章使用到的内容之前教学中都有详细讲解。
  • 本章内容针对零基础或基础较差的同学比较友好,可能对于有基础的同学来说很简单,希望大家可以根据自己的实际情况选择继续看完或等待看下一篇文章。谢谢大家的谅解!

1.生活中的 多线程

从今天起,我就和大家一起来学习Java多线程。在学习Java多线程之前,想通过几个生活中的例子让大家感受一下生活中的多线程。

小学数学题

有这样一道小学数学题,同时也是实际生活中的例子。

请问:扫地需要5分钟,烧水需要5分钟,干完这些活总共需要多少分钟?

有没有人算出是10分钟的,嘿嘿,答案是5分钟。 因为烧水的同时还可以去扫地,它们可以同时进行。 请大家记住这个例子,待会讲解多线程概念的时候理解更快哦。

PS:还有小伙伴说0分钟的,因为什么呢?他说扫地现在有扫地机器人做不需要我去做,烧水是电水壶做也不需要我去做,所以是0分钟。我只想说:“大哥们,别闹。”

售票

我国每年到春运的时候,买票就成了一个问题。

无论是 售票窗口 还是 售票机 ,它们都不是一个或一台,一般火车站都有很多个售票窗口和很多台售票机:

因为买票的人太多,一个售票窗口或一台售票机太慢, 多个售票窗口或多台售票机同时开售会比较快一些

同时做某事

好了,生活中的例子举两个就够了,大家发现了它们有什么共同点吗?

第一个数学例子: 因为烧水的同时还可以去扫地,它们可以同时进行。

第二个售票例子: 多个售票窗口或多台售票机同时开售会比较快一些

这两个例子都有同一个词: 同时

好,请大家记住这个词。

接下来,我们来用代码描述一下第一个数学例子。

2.顺序执行

这里可能和第一个数学例子有点差异,但是大致意思是一样的。

演示:

请分别定义两个方法,一个方法里面输出“扫地+‘完成百分比’”,另一个方法里面输出“烧水+‘完成百分比’”。

请观察程序代码及结果。

代码:

Main类:

结果:

从运行结果来看,并不是同时进行的,我们是 先烧的水,等水烧开了以后再扫的地 ,这样就 不是同时 进行的。

我们来看看程序代码是怎么写的,首先我们定义了两个方法boilWater()和sweepTheFloor()。boilWater()方法是烧水:

sweepTheFloor()是扫地:

两个方法里面我们都用for循环来做完成度:

最后,我们在main()方法里面调用这两个方法:

执行结果:

大家注意看main()方法里面的调用顺序:

此次调用顺序是boilWater()方法在前sweepTheFloor()方法在后。

现在,我们将调用顺序转换一下,让sweepTheFloor()方法在前boilWater()方法在后:

运行程序,执行结果:

从运行结果来看,此次是 先扫完地,再烧的水

于是,我们就发现:

boilWater()方法在前sweepTheFloor()方法在后=》先拖地,再烧水。

sweepTheFloor()方法在前boilWater()方法在后=》先烧水,再拖地。

大家能总结一下吗?

我们现在写的所有程序都是顺序执行的。

什么意思?

就是 程序是按照代码书写的顺序执行的 。比如本例中的sweepTheFloor()方法和boilWater()方法调用顺序的不同,执行结果也不同。 谁在前就先执行谁

3.同时执行

通过上一小节,我们知道了前面所学和所写的程序都是 顺序执行 的,接下来,就来体验 同时执行 的程序。

演示:

请分别定义两个方法,一个方法里面输出“扫地+‘完成百分比’”,另一个方法里面输出“烧水+‘完成百分比’”。

请让这两个方法同时被执行。

请观察程序代码及结果。

代码:

Main类:

结果:

从运行结果来看,这次是符合我们要求的,它们是同时开始执行的,我们可以到结果中,扫地和扫水都有在进行,而不是之前的扫完地再去烧水或者烧完水再去扫地。

那么程序是怎么做到呢?

sweepTheFloor()方法和boilWater()方法上一小节说过了,这里就不再赘述了,下面直接看main()方法:

我们创建了两个 线程 (至于什么是“线程”待会再说)

根据上图了解到这两个线程是通过匿名内部类方式创建的,所以可以直接在new Thread()后面跟上{}(花括号),然后在{}里面重写Thread类的run()方法:

为什么要重写run()方法?

因为 线程Thread类里面的run()方法是用来存放自定义要运行的代码地方

例如,我们在这两个线程里面调用的sweepTheFloor()方法和boilWater()方法。

当我们线程创建好了以后,需要启动,如何启动线程呢?调用其start()方法即可:

接下来就是运行,看执行结果:

从运行结果来看,扫地和烧水都是在同时运行的,不是先执行完扫地,再去执行烧水。

这里可能有不少小伙伴有很多问题要问了,Thread是什么?为什么要有线程?线程如何创建?…….等等问题。本章呢,我们只是 认识和体验线程,关于更多的线程知识,我们后面还有更多章节在等着大家,希望大家可以持续关注我们,谢谢

接下来,我们就来了解什么是线程。

4.什么是进程?

在讲解什么是线程之前,我们还是需要有一个 进程 的概念。

为什么需要先讲解 进程

因为 线程存在于进程中 – 每个进程至少有一个线程。

下面就是 进程 的定义:

进程定义有点长,没关系,我们分词解释+举例说明。

首先呢,我们希望我们Windows用户可以通过 任务管理器(快捷键:Ctrl+Shift+Esc) 来查看系统中的进程,然后结合着进程定义来看:

第一句,进程具有独立的执行环境:

说的就是进程就是一个独立运行的程序。例如QQ:

第二句,进程通常具有完整的私有基本运行时资源集:

我们知道程序是用代码写的,通俗来说就是 程序就是代码堆积的 ,所以代码之间的调用等操作会产生一些数据,这些 数据就是资源 。比如我们Java程序,我们会写很多类,还有很多变量等等,这些都需要一个地方来存放,这时候就会被存放在进程所在的内存空间。

PS:在 一章中我们简单说一下内存空间,感兴趣的小伙伴可以点击阅读。

第三句,特别是每个进程都有自己的内存空间:

这一句就表示我们 每个进程都有自己的内存空间

第四句,进程通常被视为程序或应用程序的同义词:

这一句说的就是 我们把进程通常称作程序或应用程序 。例如,日常生活中,我们会说QQ、QQ程序、QQ应用程序,但几乎不说QQ进程。

第五句,但是,用户看作单个应用程序的内容实际上可能是一组协作进程:

这一句说的什么意思呢?

看图:

上图是 Chrome 浏览器的进程。

但是,我们发现Chrome进程前面有个三角形图标:

点击看看:

哇,里面还有6个进程。

所以,“ 但是,用户看作单个应用程序的内容实际上可能是一组协作进程 ”这句话里面的“ 单个应用程序的内容实际上可能是一组协作进程 ”指的就是这个情况。

综上所述

好了,进程的定义我们分词解释+举例说明讲解了一遍,这里我们还是需要一句简短的话来概括:

进程就是正在执行中的程序。

5.什么是线程?

了解了什么进程,接下来,我们来看看什么是线程。

线程有时被称为轻量级进程。进程和线程都提供执行环境,但创建新线程所需的资源比创建新进程要少。

线程存在于进程中 – 每个进程至少有一个线程。线程共享进程的资源,包括内存和打开文件。

我们还是分词解释+举例说明,

第一句,线程有时被称为轻量级进程。

因为线程和进程都可以被创建和被执行,所以线程有时被称为轻量级进程。

例如,我们的Chrome程序,它里面就可以创建很多个线程帮忙执行任务,比如加载网页,执行下载……等等都是可以用线程完成。

第二句,进程和线程都提供执行环境,但创建新线程所需的资源比创建新进程要少:

这一句说了两点。

一是进程和线程都可以被处理器执行。处理器暂时理解为CPU。例如,我们的Chrome进程被CPU执行:

二是创建一个线程的花销要比创建一个进程的花销要小,所以建议我们以后尽量多的使用线程。例如,创建进程时间太久、进程占用内存空间太大……等等:

第三句,线程存在于进程中 – 每个进程至少有一个线程。

这句说的是每个进程中至少存在一个线程。例如,我们的Chrome浏览器应用程序里面有很多个线程在帮助它执行任务。

第四句,线程共享进程的资源,包括内存和打开文件。

我们再把刚刚那个图贴一下:

从图中,我们可以形象地看出线程存在与进程中,所以多个线程共享一个进程里面的资源一点问题都没有。

综上所述

结合上面分词解释+举例说明,一句话概括就是:

线程是进程的基本执行单元。

在Java中,线程也和异常一样,可以用类来描述:

线程就是Thread类。

Thread类具体讲解在后续章节中,本章不讲解。

6.CPU是怎么执行进程或线程的呢?

比如,这里我们有三个正在运行的程序,QQ、网易云音乐和迅雷:

那么CPU是如何执行它们的呢?

CPU在这几个进程之间做着高速的切换:

谁拿到执行权就执行谁。 这个图请大家记住。

所以,我们前面小节写的程序也可以形象表达出来。首先是扫地和烧水的顺序执行程序:

然后是 扫地和烧水的同时执行程序(CPU正在切换)

这里要跟大家说一下的就是,其实这个问题属于 并发问题 ,但是 并发 我们本章不讲,等创建线程讲完之后再讲解 什么是并发?什么是并行?并发和并行它们之间有什么区别? 这些都会讲解,请大家持续关注我们。

总结

  • 程序是按照代码书写的顺序执行的。
  • 进程具有独立的执行环境。进程通常具有完整的私有基本运行时资源集,特别是每个进程都有自己的内存空间。进程通常被视为程序或应用程序的同义词。但是,用户看作单个应用程序的内容实际上可能是一组协作进程。
  • 线程有时被称为轻量级进程。进程和线程都提供执行环境,但创建新线程所需的资源比创建新进程要少。
  • 线程存在于进程中 – 每个进程至少有一个线程。线程共享进程的资源,包括内存和打开文件。

至此,Java中认识多线程相关内容讲解先告一段落,更多内容请持续关注。

答疑

如果大家有问题或想了解更多前沿技术,请在下方留言或评论,我会为大家解答。

上一章

下一章

“全栈2019”Java多线程第二章:创建多线程之继承Thread类

学习小组

加入同步学习小组,共同交流与进步。

  • 方式一:关注头条号Gorhaf,私信“Java学习小组”。
  • 方式二:关注公众号Gorhaf,回复“Java学习小组”。

全栈工程师学习计划

关注我们,加入“全栈工程师学习计划”。

版权声明

原创不易,未经允许不得转载!

文章来源:智云一二三科技

文章标题:“全栈2019”Java多线程第一章:多线程简介

文章地址:https://www.zhihuclub.com/183280.shtml

关于作者: 智云科技

热门文章

网站地图