00:00
好,那么出了异常之后呢,咱们来讲下一个章节这块呢,我们就要多线程,哎,稍微的说两句,哎出了异常的话呢,后边这个章节呢,其实先讲哪个后讲哪个都行。比如说我这儿呢,是先讲的多线程,咱们也可以先讲第11章也可以呢,先讲这块呢,其实十二十三十四的都算是跟集合相关的啊,就是也可以呢,先讲这三章也可以呢,先讲file类与L流,这个L流呢,我们讲完以后呢,再讲网络编程的要合适一点啊,所以这俩你可以看成一起的,然后呢,这个反射机制呢,也可以说先讲。哎,这个新特性呢,也可以先讲。所以下边这块呢,其实就比较灵活一些,我说这个的目的是什么呢。就是也有的同学说,哎呀,今天我这状态不太好,多线呢没整明白是吧,说我明天呢,我也学不好。这个没什么相关性啊,就是多线程的这块没整明白呢,跟第11章常用类呢,和技术API没有关系,我们讲集合的时候呢,跟多线程呢也没什么关系。所以呢,都是相对来说比较独立的解决具体某一块问题的这样的一些API了啊。
01:05
但是呢,大家都跟。面向对象有关系是吧,诶面向对象没整明白,那下边是会受影响,但是你也不用那么紧张啊,所谓的整明白呢,其实也是我们通过下边这个学习啊,大家你会发现呢,你对面向对象的理解呢,是越来越好的。所以如果我要画一个简单的一个小图的话呢,比如说这块咱们理解成呢,叫面向对象啊op了,然后下边呢,就衍生出来一些具体的应用场景,比如说多线程。啊,比如说我们在内存当中保存多个数据,除了数组之外呢,还可以用集合,这就集合的内容了,然后顺带着这个集合呢,我们再讲讲数据结构啊,然后呢,还给大家讲这个叫L。说呢数据呢,如何在内存当中和我们磁盘当中进行数据的一个交换,这就是L流的内容反射啊,为我们以后呢讲框架呢,做这个储备新特性是吧,还有一些常用类,比如字符串啊,日期时间的API啊,包括我们前面讲过说对象如何比较大小,使用的这个比较细啊,这个呢都算是哎常用的这个API了。
02:05
行,这些内容彼此之间都是独立的。啊,没有什么相互的关系,各是各。啊,都是呢,基于面向对象,我们看看具体的应用了。行,那咱们首先呢,这块讲的呢,叫多线程啊,把它呢打开。好,那么多线程这块呢,我一共是列了好多个这个专题,这块呢,稍微长一点,咱们看这呢也行。先来看一看这一章咱们要讲哪几个事儿,先心里有数啊。嗯,首先呢,是一个概念哈,这里边儿我们谈谈什么叫程序,什么叫进程,什么叫线程是吧,包括呢,这里边儿再提一提这个单核CPU多核CPU,包括并行并发是什么概念。这个呢,就是我们第一个这呢不涉及到代码了,就是一些概念的理解,OK。然后接下来的话呢,我们看看在Java程序当中,呃,应该如何去创建。线程呢,这块呢,首先讲两种比较经典的方式。
03:02
啊,一个呢叫继承thread类,一个呢叫实现reable接口,然后呢,最后呢,你发现了我这呢,我又补了一个内容哈,说呢,在GT5.0当中,我们又增加了两种创建多线程的方式。所以呢,要整体来讲呢,算是有几种啊。四种吧。上边两种,下边两种,这不就四种吗?所以呢,如果呃,这个笔试面试当中问你啊,说这个有几种创建方式呢?呃,到那个时候你应该答有四种了啊,但是咱们现在重点讲的呢,实际上是前两种,当然这两种的话呢,以后呢,像扎va的同学呢,咱们还要学一个技术呢,叫做GC啊。Doc就是Java呢,并发编程啊,涉及到的这个内容,这个后期再讲JC的时候呢,我们再把这两种方式呢,重点的再说一说。OK啊行,这儿呢,我们就把它引入啊,这个呢不作为咱们这章的重点内容,这呢就讲的你如何去创建多线程啊,这两种方式需要大家掌握。好,那么在这里边儿呢,我们会用到一个类啊,这个类呢叫做thread类,这个类呢,你看名字起的也挺好啊。
04:05
此外翻译过来呢,就叫做线程。所以呢,我们要跟这个类呢打交道,那咱们看看这个类呢,都有哪些常见的方法,熟悉熟悉,OK,那这就可以了,然后再接下来说,既然呢,我们讲了一个线程,这个线程的话呢,其实咱们这个写main方法的这一课开始哈,这其实呢就已经涉及到线程了,我们一执行这个酶方法,其实里边呢,就是一个main线程。就是所谓的主线程。这个线程的话呢,我们后边呢,还可以自己再创建,那既然你能创建,这是我们就要谈一谈这个线程,这个你一开始呢创建了,然后呢,到某个场景呢消亡了,那中间呢,有一些过程,比如运行啊,阻塞呀,是吧,这个时候我们看看它的一个生命周期。那那其实呢,也是顺着我们这个方法呢,往下说的,因为呢,通过这个方法呢,就能够体现它生命周期的相关状态的一个变化。OK啊行,这个呢,也是算自然而然的一个事儿啊,那么在接下来的话呢,我们就得引出,只要呢,涉及到多线程可能会出现的一个问题,叫做线程的安全问题。
05:06
啊,咱们前面呢,提到过这个词在哪提的。对,单立模式中的这个懒汉式是吧,呃,懒汉式当然呢,我们稍微提了一下啊,说如果要是哎多个线程,呃来去调你这个方法呢,返回一个单立的一个这个对象了,说可能会有安全问题,当时咱们稍微说了两句是吧。那细节的话呢,我们就在这儿来讲了。好,那我们就要说怎么叫现场安全问题啊啊怎么解决呀,哎,这我们就提到了叫同步机制,同步机制里边呢,涉及到两种,一个呢叫同步代码块,一个叫同步方法。啊,主要呢,就是这两种方式,所以呢,咱们就使用这个同步呢,来解决现场的安全问题,顺便的话呢,咱们把这个懒汉室呢,不就也解决了。呃,但是呢,这块呢,我们说同步的这种方式啊,它可能会带来一个问题,就是可能会出现死锁。所以我们再看看说什么叫思索,怎么去避免思索是吧,这样的场景。
06:00
好,那么这儿呢,是咱们说经典的解决现场安全问题方式,叫同步机制了。在在GP5.0的时候呢,又增加了一种处理方案,叫做lock的方式。哎,这个log呢叫锁是吧,其实呢,是我们API里边的一个接口了。好,那么通过锁定方式也能够解决这个现场安全问题。那那这块呢,我们把它呢,也稍微的提一下啊,那么我们也只是稍微讲一讲啊,然后呢,看它怎么去处理的,也写一个例子呢去演示,具体的话呢,我们还是放到以后的这个guc当中呢,去讲这个lock,因为里边这个锁呀特别多。OK啊行,这个呢,就是它相当于呢,我们处理线程安全问题,是咱们这章里边一个重头戏,你看涉及到的这个专题呢,都比较多。前面的话呢,一个主要问题就是如何呢去创建多线程。那创建多线程呢,可能会出现安全问题,我们就得去解决安全问题,这呢是来解决安全问题的。啊,后边这个线程通信呢,其实就是一个补充内容了,说线程之间呢,可能他们会有规律的去做一些操作,这个有规律的性规,这个规律性的我们可以通过通信的去实现,啊就是这种通信。
07:09
就他这没了,是不是又多了两种创新方式啊,这呢,就我们这一章的内容,核心问题重点。如何创建?如何解决现场安全问题是吧?哎,这两个是核心啊。好,这个呢清楚,然后呢,咱们首先说第一个啊,相关的这个概念。啊,首先呢,这块有个引入。这叫多线程啊,咱们这一章说呢,我们前面呢,讲这个程序的时候呢,其实都是一个单线程的问题,说呢满足啊相关的这个语句,比如从B方法进来,我们默认的就是从上往下的顺序呢,依次执行的,在这个过程当中呢,可能会有一些分支啊,有些循环呀,但整体来讲呢,其实就是一个执行路径啊。说现在呢,我们想设计个程序呢,希望有多条执行路径同时的去执行。就好比比如说一边玩游戏,一边呢QQ聊天,一边呢又听歌,这呢其实就是多条执行路径了。
08:04
啊,那么这呢,其实就涉及到叫多线程问题了。OK啊行,那这块呢,我们就看看这里边儿几个概念,首先第一个呢,叫做程序。第二要进程,第三个呢叫县城,其实这三个词呢,不太难理解。先看第一个程序。啊,一说到程序呢,咱们以后呢,就就叫程序员了啊programmer是吧。那如果你要是过年找着工作回老家,家里边这个亲戚问你说干啥呢,你说当成员呢?啊,接着问一个什么是程序员,程序是啥。你咋解释啊?你修电脑的。你一说修电脑的,我就想起来一个事儿哈,就是我也是最初当成员的时候呢,就是你会发现呢,身边不是成员的那些朋友,他一说知道你是程序员,他就认为你无所不能。是吧,对,你给我装个系统啊,装个系统还行吧,是吧,他说我电脑这块出问题了,那块出问题了,我怎么装一台电脑啊,各种各样问题全都问你,然后你反正有一个,你说这个我也不清楚,他就问你,你怎么会不清楚呢?你不是程序员吗?是吧。
09:10
就很郁闷啊。对这个程序员的话呢,咱就先简单来说,你也分成好多种编程语言的是吧,也不是说所有的语言你一上来说呢,就咔咔的都能写是吧,电影可能看多了,感觉都是拯救世界的角色啊。这个程序员,那程序员干啥的呢?什么是程序啊。是吧,家里边儿这个老人要问着了,突然可能一下子还有点儿懵,是吧?啊,你可能就是就是写代码的,什么是代码啊。就是一堆符号,那写一堆符号干嘛呀,是吧,感觉跟面试似的啊。这个面试的话呢,你相当于只要你不停的问为什么一定会问住你是吧。嗯,好,那什么叫程序,你看这里边儿写的一个相对来说比较官方的一个概念哈,说呢,为了完成特定的任务,用某种语言编写的一组指令的集合。
10:01
啊,你要把这句话记一记,过年的时候呢,这个给老人这样说一下,估计他就不想跟你聊天了,是吧,啊。一组指令的集合啊,诶,为了满足特定任务,就是你写这个代码,你得知道是要干什么的是吧。然后它呢,其实是一段静态的代码啊,静态的对象。什么意思呢?这个大家呢,咱们也装了很多的软件,包括idea本身是只要你找到啊,你比如说咱们这个我把开发工具呢,是装到这里了,咱们装了比如说idea。Idea呢?啊,这是吧,好,那么把它打开这个呢,其实理解成就算是叫程序了。或者你换句话说,这不里边蕴含的都是各种各样的指令吗?是吧,就是这个呢,暂时我没有把它运行起来,就是它此时呢,没有去假设我把这个idea,我现在给它关掉了,相当于啊。现在呢,你在这个。呃,我们的任务管理器是不是进程是吧,这块你其实找不到这个idea了。他现在就是一段静态的代码,躺在我们这个硬盘当中的。
11:01
说接下来的话呢,我们通过这个B目录里边呢,它有一个这样的一个可执行性的一个文件啊,然后呢,我选择双击。此时的话呢,我们就把这个软件呢,给它启动起来,让它运行起来了,那这时候你再看这个任务管理器。那你就能够找到这有个idea,它呢现在是一个进程。什么叫进程呢?就是执行当中的这个程序了。啊,你看刚才呢,是静静的躺在这儿呢,没有任何的执行可言,静态的代码,然后呢,我把它呢给运行起来了,现在呢,它就是一个运行当中的进程了。哎,所以这个技能的话呢,也就很自然而然,那我们就引入了它呢,就相当于程序的一次执行过程,或者呢,理解成正在内存当中运行的这个应用程序了,运行中的QQ啊,运行中的网页音乐播放器啊,这呢都叫做进程。说每一个进程呢,都有一个独立的内存空间啊,这个系统运行一个程序即是一个进程的从创建、运行到消亡的过程。你看现在呢,我们在这儿来看,这不就是一个具体的进程了吗?所以你看CPU它这块也在运算,占用我的内存啊,这是一个动态的过程啊,包括呢,我们去执行程序,这个程序要比较复杂,相应的占用的CPU也会更多。
12:12
然后当我把这个进程给它关掉的时候啊,软件一关这个进程这块呢,你看就没有了,相当于我们当前这个进程啊,就销毁了。所以呢,它是一个动态的过程啊,有创建的时候,有运行的时候,还有消亡的时候。OK啊,这边也说的很清楚,程序是静态的,进程是动态的啊,然后下边这个啊,看能不能理解。说在进程作为操作系统调度和分配资源的最小单位。也可以看出呢,叫这个系统运行程序的一个基本单位。这个这个能理解不。哎,操作系统,就咱们说的这个电脑的这个操作系统,哈哈,比如以这个Windows操作系统为例,你会发现呢,我们这个操作系统呢,首先它是支持多进程的。你就像现在呢,我一边呢,这个给大家讲着课,大家呢能看到我的屏幕这儿呢,用的是一个红蜘蛛的软件,另外呢,这块我还录着课啊,用的是一维录屏,然后我这块呢还开这个。
13:09
Markdown格式的这个文件啊,包括呢,这个咱们线上有几个同学,我还开着这个线上的是吧,这些呢,都是每一个都是一个程了,我这个Windows操作系统呢,首先它是支持多进程的。然后呢,在这个支持多进程的过程当中啊,我们说呢,它是以进程为基本单位的,就像我们在这里边看这个任务管理器一样,这呢你看到都是一个一个的进程,这儿呢,就理解成是基本的单位了。OK啊,行,体会一下他。行,这个呢就过了,然后呢,我们再来说说这个线程的概念啊,线程呢,翻译过来呢,就做thread了,说进程可进一步细化为线程。是程序内部的一条执行路径。啊,内部的一条执行路径,一个进程呢,至少有一个线程。那就阳位置呢,你可以有多个线程,如果呢一个。
14:00
进程里边有多个线程,我们就说呢,它是支持多线程的。就好比是呢操作系统,我们Windows操作系统呢,它其实是支持多进程。啊,是类似的这个情况啊。呃,一条执行路径就成为了一个线程。那这个大家注意一下啊,这儿呢,我说到这儿可以举一个例子。你比如现在呢,我上面这块呢,其实没有启动这个,这是一个后台的哈,这呢没有启动这个360的这个主程序,然后我可以把这个360的我给启动起来看,我这块一点击看,回过来看,在这儿看上面不就发现这样一个进程。诶,我把它呢就给调取了啊,那调下去以后的话呢,我说这个360啊,它是支持这个多线程的啊这样一个情况啊,首先呢,你目前看到它占用的这个内存呢,比如说100多兆是吧。好,现在的话呢,我可以。啊,进行一个体检。然后呢,进行一个木马查杀,进行一个电脑清理,还可以系统修复是吧,同时呢,都开始执行这里边儿的每一个呢,大家都可以理解成是一个线程,这不就是四个线程都在跑。
15:04
所以这块你发现它占用的这个资源呢,自然而然的也就变高了是吧。行,我这就不让他扫了啊,就停一下了,就说明呢,我们这个360呢,它这个进程目前正在运行,它就是支持多线程的。这不有好几条执行路径同时在执行吗?这个还没停呢是吧。诶,这个把它停了以后呢,相应的这个内存呢,一会儿就会降下来了啊好,然后的话呢,我现在把它一关。这就没了,相当于这个进程呢,我就把它给关掉了。哎,就这样的一个过程,OK啊行,大家呢,稍微的体会一下什么叫。程序什么叫进程,什么叫线程啊,其实呢,不是特别难理解啊,这个咱们把idea呢,我再启动起来。简单的来说一下啊。诶,打开我们这个。呃,当前这个module啊,第一个啊,第一个里边呢,关于这个概念,这个呢,有时候呢,在这个笔试当中会出现这个问题啊,问你程序进程和线程他们仨有啥区别,这个你稍微的能够说一说啊,程序的话呢,呃,就这里边的这句话。
16:09
啊,一段静态的代码。就把这个呢粘过来就行,这个呢,静态的对象,这个可以也不说是吧,这个就行啊,就是一段静态代码。啊,前面这个你要记不住,你就说这个就行。现在进程呢?接着你就记住,它理解成是程序的一次执行过程。哎,把这个呢,哎就这是吧,依次进行过程啊把这个呢,说一下CTRLC。来粘过来,然后呢,呃,另外呢,你要再补一句,或者呢,你容易理解的话呢,其实就这句啊,程序呢是静止的,进程呢是动态的。啊,就这个,然后呢,关于这个进程呢,如果说呢,想描述的再深入一点,把这句话呢,可以说一下。啊,这个我们相当于是一个补充的内容,它呢作为咱们操作系统调度或者叫分配资源的最小单位,这个呢,直接体现的就是我们这块看这个任务管理器是不是看的都是以进程为基本单位啊,列举出来的各个进程啊。
17:04
好,这就过了,然后线程,线程呢,你就接着说,它实际上是进程的进一步的概念,说进程呢,进一步细化为线程是程序的一条执行路径。啊,其实呢,就体现了就是执行路径这样一个问题。OK,好啊,然后呢,这里边儿还写了线程呢,是作为CPU调度和执行的最小单位,这个理解吧。就是我们现在呢,这个CPU现在要分配这个资源了,它分配的话呢,你说诶这不分配到进程上没问题,但是这个进程的话呢,里边不是可能会有多个线程嘛,也就是所谓的多个执行路径,那现在假设我们是一个单核的CPU。我这个单核CPU呢,假设呢,还就只有你这一个进程。即使呢,就这一个进程,我也得看我这CPU可能是先给你这个线程在执行,也可能是我又切换到这个线程上了,一会儿呢,我又切换到这个线程上了。就是这个CPU呢,它在执行的时候呢,最小的这个处理单位就是这个执行路径了,也就我们所说的这个线程。
18:01
他呢,需要这个不断的去做这个任务的切换,让你感觉呢,三个线程同时都在执行似的。哎,这是这个概念啊。好,这是我们说的这个问题,然后下一个问题呢,这块呢,就提到了一个进程。共享呃一个呃,单独的内存单元,什么意思呢?就大家你看我这个红框哈。这个红框的话呢,我们称为它叫这个内存的这个结构了哈,分成这样几个部分,前面我们也说过了,那么这一个红框呢,它其实对应的就是一个进程。啊,一个进程实际上呢,我们也可以理解成就是一个应用程序了哈,一个应用程序呢,对应的就是一个进程,然后呢这呢就可以理解成是我们一个GM的一个实例了哈。就相当于你这个扎逊尼现在就在运行的这样的一个项目嘛。啊,这个项目就是一个应用程序,运行不就是一个进程吗。OK,然后呢,诶,那么一个进程里边咱们说了是不是可以能有多个线程吧。
19:02
就是多个执行路径哈,好,那么这里边儿就会涉及到了有一些内存结构呢,是每个县城一份。那有一些内存结构呢,是多个线程呢,共享的。那这里边儿涉及到那到底哪些是独享,哪些是共享呢,这块呢,就提到了这边的。这个我叫县城隔离区,也就是说呢,每一个县城都有一份虚拟驿站,本地方法站和成为计数器。然后呢,多个线程对应的这个进程,咱们只有一份方法取和对。体会一下。你比如我现在呢,咱们是一个主线程,没线程进来了,里边呢,你调一些方法,这呢你对应的你这个展示它,那我们下边不还讲自己去创建一个线程嘛,自己创建一个线程里边要对应的几个方法的执行,那就是一个新的一个虚拟基站。所以站的话呢,可能有多个,每一个线程对应一个站,就是我们所说这个虚拟站。
20:00
啊,对应的这个站的话呢,你指定到哪儿了,我们有一个记录这个你的指定的地址的,其实就是成序计数器,所以只要有多个虚拟站,自然而然的也就会有多个程序计数器啊。所以这个就很自然的,这个呢,就是要体有方法的占是吧,这呢也是每个线上一份,也很好理解,那大家呢,共享方法去和堆。哎,这个大家注意一下啊,我们就只有一个堆啊,哎,那么好处是什么呢。好处呢,就是如果我们多个线程,大家操作共享的数据的话呢,我们就把这个共享的数据,比如说是个对象哈,这儿呢相当于是一个,呃,这个这个线程是吧,这儿呢是一个线程的这个站,这儿呢是一个线程在两个大家呢共用同一个堆在这里边,假设有个数据是不是这个线程能访问,这个线程也可以访问。所以呢,就是多个线程的来处理一个进程当中的共享数据问题比较容易。这就是相当于呢,叫县城间的通信了。咱俩通信的话呢,都借助于公共的这个数据通信比较方便。方便呢是好处,缺点呢?
21:00
对,缺点呢,就可能会不安全,因为呢,咱们有共享的数据嘛,那么大家都去操作,那这块呢,到底谁先来谁后来是吧,我还没操作完你就来操作了,这不就带来隐患问题吗。所以我们后边要讲这个线上的安全问题的处理是吧。啊,那这块你看我们有说这个事儿哈,所以呢,咱们现在讲的是县城间的通信哈,我没有说进程间的通信。这一说进程了,这个事儿就比较复杂了。因为呢,这儿呢,是一个应用程序,有一套内存空间。哎,又有一个进程,是不是又有一套完整的内存空间了。这是一个GM的一个实例了,这是不是又是一个GM的实例了?哎,那么这两个之间如果也想通信这个事儿呢,就比较复杂了。哎,当然这个通信呢,也是必要的啊,什么意思啊,你比如说大家这个手机,假如咱们这安卓系统的是吧,安卓系统每一个应用程序就是每一个APP,其实呢,是不是都是一个应用程序。你要把这个运用起来,这个运用起来是不是就是两个独立的进程了。
22:01
你说这种竞争之间,他们需要通信吗?需要,能举例吗?啊,支付宝,对支付宝跟你那个,比如用饿了么点是吧,对饿么了,你要调这个支付宝。有淘宝。对,就淘宝也是是吧,淘宝的话你会调这个支付宝啊没问题,然后还有呢,比如说你这个照相机,调你这个图片这个应用是吧,还包括呢,像微信呢,还各种社交软件呀,他可能在启动的时候,他都会要申请一个权限,就是扫描你的联系人的这个信息是吧。对这个联系人的话呢,是一个独立的应用,它都呢要跨进程要通信要获取的数据,那这个呢,就是进程间的通信,这个呢要稍微来说复杂一点,没有我们这个一个进程当中多个线程这种方便啊,这种等以后大家需要的时候呢,我们再谈这种进程键的通信啊。OK,行,这个呢,我们说的这个事儿。啊,这个呢就比较清晰了,然后呢,这个呃,多线程的问题,在一个进程当中,如果有多个这个呢,我们还可以举个例子是吧,比如说呢,用这个飞秋跟别人在通信的时候,啊,我呢在这儿编辑信息,我点发送这个呢,其实就是你编写的一个。
23:12
线程,然后你在编辑过程当中呢,也不影响别人这块给你发上面这块,你能呈现出来这个信息,这个呢,其实就是在接收的一个线程。那对于对方来讲也同样的道理,是吧,这呢就是多现成的啊。好,下边涉及这个叫线程的调度,这个大家了解一下就行,什么意思呢?就是咱们这个假设这个程序呢,是有多个线程了,CPU现在要执行了,那到底我是怎么选择呀。是吧,先执行哪个后执行哪个呀,这第一种方案呢,叫做分时调度。什么叫什么叫分时调度呢?就是我轮流的使用CPU的使用权,说我给你执行,比如说500毫秒。已经够长了是吧,然后我给你接下来给你执行500毫秒,然后接着给你500毫秒,所以呢,就是平均的分配每个线程占用CPU的这个时间。这呢叫分时调度,还有一种呢,叫抢占式调度。
24:00
抢战士,抢战士就抢呗。这里面就提到个优先级的问题,优先级高的它会以较大的概率呢优先使用CPU,然后呢,优先低的呢,你就等等,那优先级相同的,那就相对来说就随机了。哎,这样的一种方式啊,咱们Java这块呢,使用的是抢占式的角度。也就是说呢,我们可以呢,去设置每一个线程的优先级,高的话呢,就是可以优先的去调用CPU啊,就这个意思。好,那么下一个问题啊,说这个我们多线程啊,刚才提到了这样一个点啊,一个进程当中可以有多个线程,那有什么好处呢。是吧,你看这块我列了一下这个问题哈,哎,有什么好处呢,这块呢,其实还有一个大的背景啊,大家你看有没有这样的一个,咱算一个常识吧。假设呢,我现在是一个单核的CPU,注意啊,我这块强调的是单核的。现在基本上大家电脑没有人是单核的,全都是多核的是吧。单核的话呢,就意味着它只有一个核心,相当于同一个时间段之内哈,它是不是只能执行一个线程啊。
25:01
对,就这样的特征,好,那么这个单核CPU,我现在有这样一个场景,大家看哪个快啊。第一个话呢,就是我C盘呢有一个文件A,我把这个文件呢,需要复制到。呃,地盘。同时呢,我有一个B啊,这个B文件是在E盘里边的,我把它呢,要复制到这个F盘。第一种方案呢,就是当A呢,我就先让它复制到D盘,复制完的那一瞬间是吧,我就紧接着让这个需求呢也跟上。相当于是一个。串行的是吧。诶这呢,你看复制他俩花的时间,然后第二种方案呢,就是A呢,往这个从C盘往D盘复制,然后这个呢,E盘往F盘复制,假设呢,这个文件呢,都是一个G的大小啊,也不算小了,它俩呢同时我就开启。复制。啊,那么问哪个快。有同学立马说第一个快是吧?是第一个快吗?那一样。
26:00
嗯,单核CPU啊。啊呀。对,其实应该是第一个快。你这块我强调一个大背景啊,叫单核的哈,你要是多核的话呢,这个通常就二会快一些了,因为你可以调两个核是吧,同时的帮你这块复制,这块复制,而这个呢,就只有一个,那肯定是这个块了,现在单核的情况下呢,有同学说一样,其实还有点区别,区别差在哪儿了呢?就是单核的时候呢,它对于第一种情况没得说了,就是这块执行这个复制,复制完以后呢,复制它,而你对于第二种情况呢,它还需要有一个切换。对,我给你干活,然后我给你干活,中间这个切换呢,你一个G的文件不算小,它切换的次数是很多的,这个切换的时间累加起来其实也不短。所以他就偏慢了是吧,那既然有这种情况,那为什么我们这块还要讲这个多线程的是吧。那首先的话呢,你这块咱们实际情况也不一定是单核了哈,诶所以呢,我们用多线程还是有义的,这块呢,我写了三个点,第一个说提高应用程序的响应,尤其呢,对于图形化界面来讲呢,更有意义,增加用户体验,毫无疑问。
27:05
啊,我这块呢,可以一边呢干这个一边干这个啊这种一边一边其实不就多线程的意思是吧,甚至说还是个多进程的啊再着呢,你比如像我们这个360类似这样的这个软件啊,我那呢一块儿一边一边呢可以这块扫描磁盘,一边呢还可以杀毒是吧,还可以干什么什么。同时做多件事儿啊,包括呢,我们想聊天啊,一边呢你这块正在发信息,一边呢还能接收信息,这不都是多线程吗。下一个要提高计算机系统CPU的一个利用率。啊,CPU呢往这一放,然后这块呢,我同时呢,多个线程,多个进程呢,都先抛给他,他这块呢自己呢去切换的执行,这不就提高了它的利用率了。啊,因为你不可能说这个执行完以后呢,你立马就能接上一个新的任务,中间肯定会有间隔,那我同时抛给你自己去分配得了,这不就是同时执行,这就是个多线程。啊,那也可能就是一个多进程的场景啊,下边将改善程序结构,将既长又复杂的进程分成多个线程独立运行,利于理解和修改。
28:03
啊,就是如果你的代码呢,都写到一个进程里边呢,就显得特别的臃肿了,我把它拆分拆分啊,放到不同的线程当中,结构呢会更加的清晰。啊,这个意思。好,下边呢,又简单的列出了两个概念哈,这块呢大家了解一下,首先第一个呢,叫做单核CPU和多核CPU啊,那么这里边儿呢,大家需要知道,就是单核CPU呢,我们就理解成呢,在一个时间单元内呢,它只能执行一个现成的任务,就相当于呢只能做一个事儿啊,这个呢,我们可以理解成呢CPU呢,类似于医院里边医生诊室里边这个医生。说呢,在一定的时间之内呢,他只能给一个病人呢去看病。所以单核CPU呢,就意味着前边比如说经过了一系列的这个签到操作,比如说你去医院里边挂号啊等等的,挂号的窗口可能很多,但是呢,如果这个CPU呢,就只有这一个啊,单核的那就意味着大家得排队。啊,就是这样的一个现实情况啊,那么要想提升整个系统的性能,比如说你去医院看病呢,希望整体体验的更好一点,排队的时间短一点,怎么办呢?这块有两种方式,第一种呢,就是提升CPU的性能。
29:06
就相当于让医生呢看病的快一点。啊,这个你发现在医院看病,现在在中国都已经流程化了是吧,你过来什么问题啊,检查检查了没有没有先去做检查啊,做完检查来看好开点药是吧,或者做个手术啊,非常的流程化了啊,这医生看病的也非常快啊,这呢是第一个路径。那么第二路径呢,就是多加几个CPU,就相当于你这块医生不够用了,那你就多开几个诊室啊,多让几个医生呢来看病就可以了,这个呢就理解成叫多核的。啊,我记得这个在最早的时候呢,大家都在追求这个CPU的这种性能是吧,然后主频越来越高,诶达到一定程度的时候呢,当时是是上大学还是上高中,突然出来一个概念说可以双核CPU了。当然说,哎呦还可以多核是吧,其实想想的话呢,现在大家好像很好理解啊,说我们就。多加一个CPU不就完了是吧,其实这块呢,还涉及到这种调度的问题了。OK哈,但是这个思路的话呢,是没问题的,那下边一个顺带的问题说呢,多核的效率就一定是单核的数倍吗?比如我们是四核的,比如A10A53架构的这样的一个CPU,那这里边儿呢,就相当于是单核A53的四倍的一个性能嘛。
30:13
呃,理论上是,但实际上呢,不是。主要原因的话呢,有两个方面,第一个啊,多个核心,它其他的资源呢,可能会受到限制啊,就比如说我们现在是四核了,那你对应的内存呢,缓存呢,寄存器啊,你是不是同步的扩充了四倍。就好比是医院一样啊,一个医生呢,换成四个医生呢,但是做B超的时候,这个机器还是一个,所以这个性能的瓶颈呢,就不是在我们医生这儿了,就跑到这个检查B超的这个机器这块,所以它就不一定呢,是四倍关系啊,然后另外一个呢,就是多核的CPU,他们之间的一个协调管理的一个损耗,这个呢也是不可忽略的。啊,这儿呢,举了一个同步的一个例子啊,就好比是这个公司工作一个人的时候呢,你不会去浪费开会的时间,但是你要有两个人呢,去工作的时候呢,我们还得需要开会同步一下,说怎么去分配工作,那你开会的这个时间就得算上。
31:05
当然呢,这个公司呢,当然这个人数更多的时候啊,你比如说像几万人的公司,你发现呢,最后做事呢,都是一线的最底层的这些员工,上面呢,为了更好的去管理这些员工,加了一些管理岗,这些呢也加了一些管理岗,这个呢上面又加了管理岗,其实上面这些呢,就是纯做管理的了。那你其实这个对于一个公司来讲,公司越大,其实成本呢越高,因为做事的还是这些人,但是呢,中间多了一些管理的岗位。是这样情况啊。好,这呢大家做一个了解就行,然后下边呢,有个概念叫做并行与并发。啊,那么我们一提到Java的话呢,比较高级的一个技术场景,那就是高并发的场景,诶高并发啊,说的是它那并行什么意思呢?对应的这个英文呢,叫parallel啊,这个并发呢叫concurency啊,有的人叫concurrr是吧,这是这样一个概念。哎,这两个单词呢,你稍微注意一下,其实从这个单词里边呢,比如说这个并行啊,通常我也是这么理解的啊,你看这里边儿有两个L啊。
32:05
两个的话呢,你就想象成了这个交通里边,咱们平时过路口,对于这个机动车道的话呢,它有时候会有好几条这个。机动车道是吧?嗯,这个机动车道可以呢,有机动车这个呢也可以,这也可以,你可以把这两个L呢,就好比理解成了是这两条道一样啊。那就意味着你看机动车的话呢,这是不是算叫并。什么的。哎,就是并行的。就是这块呢,有一个车,这块有个车,这块车大家呢,互相之间开各自的,完全不影响彼此。那这叫并行的,它呢指两个或多个事件呢,在同一时刻发生。那你看这块呢,如果横轴呢,是一个时间轴,然后这儿呢,是对应的相互的几个事件,如果我这块拉一条线的话呢,你发现呢,在这一时刻的话呢,是有三个事件同时在执行,这个呢就属于叫并行。就好比开车一样,这不就几个机动车道吗?啊,这样一个场景啊,那指在同一个时刻呢,有多条指令在多个CPU上呢同时执行,所以这块呢,通常呢,我们都意味着是多核的这样一个场景,多条执行路径。
33:09
那理解成了,就是多个人同时做不同的事儿。那下边我还举个例子,就好比这几个大厨是吧,然后呢,他们各自呢,炒各自的这个菜。哎,这就叫并行。啊,同时都在执行,这个同时呢,你可以理解成呢,就在同一个时刻都在执行,好你说这个也没什么难的,好别跟那个并发整混了,看一下并发。并发呢?它是指两个或多个事件在同一个时间段内发生。比如我们看这个图,那么在我们这个起点,这个位置和这个位置在这样的一个时间段之内。我们发现呢,有三个事件呢,都在执行。我们就理解成三角并发了,但是你细去看的话呢,它不像我们说的并行啊,并行我们在同一时刻就有好几个时间,现在的话你要单独看一个时刻的话呢,可能就只有一个时间。
34:04
哎,就像我们这样看到的,我这打一条线,这就是在这一时刻,就这一个,这呢也同样的道理。那这呢,比如说就好比呢,是一个单核的CPU啊,单核的它呢,在这个时间段之内呢,快速的去切换这样的几个事件。切换的速度特别快,让我们感觉呢,像是这个事儿在做,这个事儿在做,这个事儿呢,同时也在做,其实细看的话呢,在同一个时间点上呢,只有一个事在做。你像以前的话呢,比如说呃,九几年的时候呢,大家那个电脑都是单核的CPU了,然后呢,你照样呢,可以在Windows操作系统上呢,一边听歌一边写代码啊,一边呢,比如说开一个远程的视频,那照样没问题,相当于Windows呢,在那个时候呢,也是支持多进程的,那进程里边最起码有一个线程的,很自然而然的也是多支持多线程的,看似呢像并看似是吧,像是并行在执行。啊,你以为说几个事儿都在执行,其实呢,你要细发现的话呢,是一个CPU在快速切换几个任务,其实是并发是吧。
35:06
OK啊,这个大家要注意一下,那这块呢,就好比是呢这个厨师。大家呢,你去吃饭的时候呢,在这个饭店里边啊,去一个小饭店了吃饭,然后这块呢,有好几桌人,现在都点了相应的这个。菜饭菜了啊,然后呢,你来的比较晚,然后呢,你等了会儿之后呢,发现诶这桌上菜了,这桌上完之后呢,这桌也上了,诶陆陆续续呢都在上,让我们感觉呢,像是后台呢,有好几个厨师都在炒菜,其实你往后台一看,后厨一看,发现就只有一个老板在那炒菜呢,是吧。哎,他自己呢,就是快速的去切换,哎给这个做着,同时呢,他在给这个在做着,实际上呢,这就是一个并发是吧。啊,这个体会一下啊。行,这个呢,大家再去理一下我们这样两个概念就可以了,那以后的话呢,我们再讲到这个guc的时候啊,这个呢,就是讲的就是并发编程。啊,并发编程这个并行的话呢,其实这块你就涉及到多个CPU啊,多个这个执行的路径同时执行就可以了,所以我们更多的考虑就是比如说在有限的这种资源的情况下呢,如何处理这种并发的这种问题。
36:07
啊,所以更多讲的就是高并发,OK。行这儿呢,大家做一个了解就行啊。行,这个前面这个笔记的话呢,我们这有一个。这个分时调度哈,我把它呢,先记到我们这个位置上。啊,这个呢,是抢占式啊。哎,这个我也放到这儿好,关于呢,下边这两个概念呢,大家做一个了解就行。
我来说两句