00:00
来,我们可以看一看方法的一个内存图啊,多种疾病一并发作。来啊,咱们这个画个图出来啊啊,咱们同学们真搞笑啊,好搞笑来。我们保存一下啊,保存一下我们叫D什么呀,32,然后我们叫run。啊。现成的软。保存一个图啊。大家注意看啊。来。这个呢,就是我们脑袋当中想象的Java虚拟机。这就是JVM。浪哥很浪是吧?行了行了行了行了,嗯,我觉得咱们每个人应该都有个外号啊。浪哥,好吧。行吧,行啊,嗯,咱们都有个代号啊,到时候也给我一个代号好吧,嗯,给我代号啊来咱们继续往下啊,继续往下,咱们再往下呢,先看看吧,先进行类加载。
01:10
行吧类加载啊,加载下来之后呢,我们要执行问方法,那行吧,那这块咱们先画一画吧,先画谁呀,我们画一个什么所谓的这个方法区。行不行,画一个方法区啊,节省点空间啊,叫方法区啊这个字呢,我让它小一点吧,啊小一点,然后这块呢,咱们来看一看啊,方法区这个类会加载呗。是不是,所以这里呢,应该是有很多class文件的啊,Class文件点class。嗯。然后它有这个叫这个system.class啊,th.class啊,还有这个MY什么thread.class啊,是不是哎有这些那行了,有很多很多咱不咱不画了啊,不画了,然后再往下呢,它肯定会有一个堆啊。
02:03
是不是这个就是那个堆呗。对不对,哎,这个就是那个堆啊,来我们把这个堆化一下,各位啊,那么接下来呢,我们这个程序呢,是先去执行我们的main方法,所以呢,这个时候会有个主线程,明白吗?会有个主线程各位啊,主线程主站啊,来我们这画一下啊,这个呢就是我们所说的主站。主线程对应的什么呀,叫做主站各位啊,然后呢,这个主站这一块呢,我们把它呢,给它先删了,然后呢,闷方法执行,所以在这个位置上它会压站啊压站这是一个闷方法。啊,这是方法,各位啊。焖方法战争好了,那么这个闷方法呢,上来第一件事儿呢,他干什么呢?在这里拗了一个对象,这个对象那一定会在这里开辟空间,这个没得说,这是一个叫做my thread线程对象,My thread对吧,线程对象。
03:06
那我们溜出来这个对象之后,这个对象的内存地址付给了这个引用对吧?哎,这个引用我们呢啊,就把它改成什么,别改了,就这么着吧,改一下也行啊,叫MT叫T吧,叫T得了啊,T简单点啊,T点和t.start那如果是T的话,这块我们应该是这样做。嗯。我这个先另存一份,各位啊,一会儿有可能会用得着。现在先别另存了。嗯。我这块啊,有一个什么呀,叫做thread t的等于什么呀,0X1234。1234好了,那这个引用呢,去指向了我们的这个线程对象。啊,这个没得说,那么接下来呢,我们程序继续往下走,它会掉T点乱,我说过方法,只要调用它会压站。
04:09
最近学的已经病入膏肓。啊。来,咱们调乱方法,各位啊,方法调用就一定会压站,这个时候就会把它压过来,明白吧?哎,这个是在哪调的呀?哎,在这个位置上你是不是调了一个方法,这个方法我们叫做什么呀?叫做t.run是不是啊,这里掉了个t.run各位啊,那么这个调t.run这个方法,只要调用它,程序必然会停下来。我这样啊,我这个另存为一份,另存为一份。哎呀,先先别另存了,就这么着吧,这么着了啊这么着了啊,一会儿再画吧,啊程序呢,走到这一块它就停下来了。明白吗?这个程序停下来,下边是不会执行的,那么这个时候呢,它会压站,把这个方法压过来。
05:05
啊,把这个方法压过来,那么压过来这个方法之后呢,这个方法其实就是t run方法战争啊叫。t1.run这个方法战针。啊,那么这个t run方法战争压过来之后呢,接下来我们这个程序。是不是得执行结束?它从头到尾输出零到999,所以这里是不会输出。零到999啊。然后呢,接下来这个是不是就结束了。对吧,那这个结束之后。我们再往下是不是继续执行。对吧,哎,这个继续执行就会输出什么呀,哎零到什么呀,9999啊。
06:04
这对吧,会输出什么呀,叫零到999。是这样的一个情况。啊,这是当前我们这个run是这样的。好。我们就说到这儿各位啊,现在这个运行一下大家看。最后是不是在这儿在输出啊。那如果说你是调的是t.start方法,那就不一样了,各位咱们看看t.start这是真正启动线程,那么这个方法呀,来我们这儿啊另存位,各位啊另存位。带32现成的什么叫大?来保存一下这块呢,我们把这个呢,先给它删了,各位。啊,这个给删掉。然后呢,我们这个呢,也给它先给它删掉,抹了啊抹了。然后呢,我们这块呢,也给它抹掉。
07:06
好。好了各位啊,来抹了它啊抹了它,那么接下来我们也是相当于执行到了这个位置上在调T点大的方法,实际上是走到这里了,各位。明白吧,那么这个方法同样也是一样,也会让程序停下来,听懂了吧,程序它执行不结束这一行代码,下面是不会执行的。听懂啊,这行代码卡住了,它会压站,会把站压过来,压过来之后呢,这个地方还是t.start叫t.start方法战争。明白吧,好,那么这个方法的任务你要搞清楚它是怎么压过来的,是因为你执行了这行代码,诶,压过来了。明白什么意思吧,哎,压过来了,记住啊,这行代码它不结束下面代码是不会执行的。
08:07
但是你这行代码的任务注意了啊,Start方法的任务啊,任务是。开辟一个新的占空间。啊,称为分支战。只要开完这个方法就结束,明白吧,只要开完这个方法就结束。于是乎这块他就开了一个占空间。听懂了吧,哎,这是一个分支站,各位叫做分支站啊分支站T,那么这个时候呢,我们开出了这个占空间之后。哎,接下来这个方法就结束了。
09:00
听懂了吗?那么这个方法一旦结束之后。他就继续往下走了。明白吗?同样这块这个站。也在压战谈战。他就继续往下走了。明白吧?听懂了吧,这个T就结束团战了,就轮到他了,这里呢会输出什么呀?哎,会输出零到999,而且这个位置马上它就会掉,哪个方法各位。这个分支站会调哪个方法,会调你这个线程当中的这个run方法。Run方法在你的战底部,这是方法战争。明白吧,这里呢,会输出什么呀,哎。零到999,并且这个输出和这个是并行的,因为我这个站执行我的,你这个站执行你的,我们是并发。
10:10
明白什么意思吗?就是说假如说这个叫做men,这个叫做T。T是并行。注意啊,T和是两个站。互不干扰。各自执行各自的。并发的啊。明白吧,哎,并发的各位。听懂了吗?那这块这个star的方法,他只要一结束。一调用它压站啊,这个就结束了,但这个方法在这执行的任务是分配占空间,但占空间分配完之后,这个方法就结束了,这个方法结束往下它就继续走了,那这个占空间分配好之后就会调转方法了。调这个乱放不需要我们调啊。
11:01
是由Java虚机来调度的,这个转放是不需要我们来调的,是Java虚机来调度的。注意啊,这个run是不需要手动调用的。手动调用的啊,是由Java逊机线程调度机制来运作的。明白吗?它是由线程的调,是由GVM线程调度的一个机制来运作的。啊,所以大家看到了这个程序运行会是怎样,会是怎样的。会是怎样的?各位,这个瞬间就结束啊,来,走一个。我们来看看。来往上走,大家看主线程是不是,哎,主线程完了到主线程,主线程你看分值线程是不是,哎,再往下你看分值线程到七,哎,你看主线程。是不是,哎分支线程对不对,哎主线程对吧?哎分支线程你看是不是。
12:04
分支线程分支线程分支线程分支线程你看再来你看主线程是不是,哎主线程。这并行啊,主执行主的分支执行分支的并行来走一个。你看煮分支,煮分支主分支,但它有可能均匀也有可能不均匀啊分支你看煮吧,是不是分支煮啊对吧?哎,分支速度这么快不一定啊,你再来一次。分支还快吗?不快了吧,是不是煮又快了?是不是煮快了?好,通过这个输出结果大家也可以看出。是不是总有一个先有一个后个呗。大家分析一下。通过这个输出结果。结果啊,我们发现什么呀,总是有一个先一个后。
13:03
对吧。而且有的是有多有少是不是。对吧,你分析一下这是为什么。以下程序的输出结果有这样的特点,怎样特点啊,有的有先。有后。有先有后。有多有少,这是咋回事儿?这里画一个问号,各位啊。画个问号。就有先有后,有多有少,你看再执行一次。因为控制台只有一个,这个说的很好啊,确实控制台只有一个,控制台电脑是单核的,不是我的电脑不是单核的啊。我电脑不是单的。这是一个是控制台,它有限,因为控制台只有一个,控制台只有一个,也许实际上是这个先执行了,只不过它它可能是后打印了。
14:08
控制台只有一个,这是一个原因。啊。那这个有先有后,有多有少是咋回事?有多有少是怎么回事?哎,这是占用CPU的一个时间片的一个这个这个这个多少啊,占用CPU时间片的多少,某个线程抢到了执行权,诶小鹏看见看来是学过呀这个东西啊,某个线程抢到了执行权,对吧?都知道执行权这个事儿啊,没事儿啊行吧,这个呢,是初步让大家认识一下多线程是什么情况啊,在这里再运行一下,大家看看多线程并发,你看就是这种感觉。就哎呀哎呀你看哎呀我的天来再来,你看是吧,哎,你看是不是,哎多建成并发就是这种感觉,就各自执行各自的,火车站有两个窗口,一个窗口是卖这个,这个卖票的,那个窗口也是卖票的,两个窗口可以同时同时进行,对吧,这叫多线程并发,那如果说你是把这个方法放开了,对不起,这不是多线程啊,就算你谬了线程你没启动,它也只是一个普通的加法类,你调这个方法也只是一个普通的加法类,明白什么意思吧?哎,你调这个方法也只是个普通加法方法去执行来走一个,你看。
15:20
那这个就不是不是并发了,各位啊,这是单线程。看见没?哎,这是单线程,单个线程啊,单个线程没有去启动分线程来这块呢,我们注释掉,来这个我们再翻开啊,这个star的方法是很重要的啊,可能两个都在抢位置,都想早点输出控制台来走一个。你看。来往上走对吧,哎,你看主线程主线程主线程主线程哎哟,我的我的天来。这个看看诶,你看主分主分主分主分是不是啊行吧,这个第一个成绩我们就体现到这啊。
我来说两句