00:00
各位同学,我们继续接下来我们从start一个线程开始,给大家进入多线程启动知识复习和深度的讲解。那么聊到这儿,部分同学可能会说,你这个GC这门课程现在是深度的知识介绍,那启动一个线程,这还用你说呀?无非就是实现了runable接口,或者继承了类,甚至是线程池,或者是回接口,我们呢,再可以启动一个线程,对吧?这个很简单,可别忘了我们这门课是什么。并发编程与什么呀,源码分析我们呢,就得给给大家看一下,从最简单的一个start启动一个线程,我们能获得什么知识,结合我们的GCGVM和操作系统底层的运作,结合我们C加加源代码的分析,来给大家介绍一个线程是如何起来的好。那么大家呢,都清楚,嗯,假如说啊,这样的快捷编码生成拉姆的表达式啊,我默认你已经是非常熟练,已经懂得,我这就不再介绍,那么对于我们这样的啊日常。
01:04
你呢,可以封装好你的快捷键,一次性生成我们的。螺旋的启动,你就不用像这样写对吧,一般而言我们呢。启动一个线程对吧,你有一个比方说这个叫T,那么它这个里面一般呢,最常用的是两个构造方法对吧?那么这个时候的话呢,一个是这个,另外一个呢是这个,那么这个的话呢,就是你传一个实现了runable接口的类,然后呢,这个线程的名字,OK,我就不多做解释了,那么所以说搁到这呢,我们这儿呢。直接用的表达式。因为runable接口它是一个。可以用拉表达式实现的一个接口,那么是函数式接口,那么搁到这儿就是我们日常所写的通告,那么来了T1这个线程start,好,这是我们以前非常熟悉的代码,那么对于start,我们来看一下它底层源码。走在696行,这我们可以看得出,所谓的start其实已经调用到的是线程点Java这个类里面,然后它调用了这么一个同步的start方法,也就是说这个线程必须要全部走完,对吧?然后的话呢,后面的话呢,不能有真切走走走走走,我们往下看所有的start方法,实质而言。
02:13
调用的是START0这个方法小伙伴们可以看一眼,在这儿有一个布尔值first start0这个方法调用完成以后马上变成触,代表启动成功。那么所谓的斯拉特林又是什么呢?我一点大家可以看得出。在我们点Java这个类里面又有了START0这个方法,而这个方法是一个什么native的方法。那么学过GM的。知识的同学,有这个知识背景的都会了解,所以native代表的是什么?GI本地接口的调用,调的是第三方C语言所编写的底层函数,或者是操作系统的底层代码,那么我们大家都清楚。从操作系统这个角度大家都了解,在我们任务管理器里面,你就是没有装GDK,它也有操作系统级别的进程和线程,有进产必然会有限产,以即得到我们的第一个结论。
03:08
对于我们的多线程,它跟语言没有太多关系,是操作系统层面所给的好,那么所以说启动了以后,那么接下来我们就要看看,换以前你可能就到这儿,到native你也就到头了,啊晓得,反正到这我明白了,Start是调一个START0D要用的是底层的native的函数,那么这个native底层又是什么呢?我们接下来我们要带大家进行一下源码的分析和讲解,好。那么大家呢,可以看得出。Java线程我们要理解它,就必须弹知道一个概念叫open jdk以及Java源代码中的更底层的源代码。那么来同学们,我们可以看得出。熟悉Java的小伙伴都清楚,这个native要的是底层C语言的函数,那么对于Java的历史知道的同学都清楚,对于我们Java而言。
04:01
现在这门语言其实而言,它的前身是哪一个语言,是不是就是我们的C加加,但是呢,由于C加加太过于强大,那么此时呢,它呢,把它一些复杂的功能呢,就做了一些简化,相当于是这门语言就把它减减了一些复杂的概念,那么就变成了Java这门语言,哎,所以说Java的上手要比C加加舒服了很多。那么回到我们老图,Java语言本身底层就是CCR语言,所以说所谓的open gd k就是指C加加原语级别对Java语言的描述和说明,那么我们来看一下。第一个。我们打开我们open gdk对于Java原语级别底层代码的展现,那么这个是他的官网。Java中的Java就是open gdk,那么有些代码你点开以后你看不到,你只能在open gdk里面看到,那么大家可以看得出目前它是已经到多少17这个版本了,那么前面说过我们本次讲解都是以Java吧为例,而且这个网站由于是国外的网站,你去翻查代码的话呢,特别的不方便,那么老师呢,已经提前将它下载到了本地,那么这个就是我们open gdk,好,那么打开我们open gdk,它呢就是这么个东东,那么大家可以看得出他这有JDK的源码,最主要就是我们的或者port,那么熟悉这个东东都会清楚,这个当然倒不是连接WiFi那个热点了啊,是我们JDK的一个版本的名字,那么大家都清楚。
05:30
Java干。我们这怎么着,是不是有hotport,哎,就是它,所以说这个就是我们用C语言描绘我们Java底层代码到底是个什么样,那么打开了以后,我们可以看得出这些有很多很多的文件夹,那么ARC,那么各种操作系中级别的,那么需要加虚拟机,好,那么在这我们有个runtime,大家请看这有很多点,CPP,如果有一定C语言基础的同学都会明白CPP.cpp就是C语言的源代码,那么这个HP就是它的头文件,类似于我们Java的import。
06:09
所以说呢,我们下载到本地,为了大家更好的学习和观看,课后我们可以把这个JAVA8的源代码发送给大家,有兴趣的同学可以上去查看,你们回到这儿,我们就要对大家进行底层的C加源码的解读,到底你一个线程start以后我们清楚了,你呢就是掉了一个。Native的START0,那么这个native start0接下来他又干了一件什么事来结合我们的操作系统,我们可以看得出。主要是有三个类,SC。GVM.cpp和third.cpp他们的路径都在这儿,那么老师呢?为了节约时间,提前给同学们整理好,我们一个一个过。首先我们明确多线程是跟操作系统级别,你但凡你去调的是native,代表调的是底层操作系统第三方C语言的接口,所以我们打开start c,这个时候我们可以看到Java的线程是通过start方法执行并启动的。
07:09
主要内容在native方法的START0里面,前面已经说过,那么open jdk与写,那么就是Java native interface Java本地接口。这样的调用一般是一一对应我们th.Java就是在我们Java里面,大家请看是不是有个thad.java必然而然会对应着就是我们这个thad.c这么一个一一匹配的关系,也就是说你Java的前身。你母胎就出自于C加加,好比天下武功出少林对吧?那么好,Java可以找到一个对应的C,那么start林其实就是GM start一个线程这样一个native方法加载的一个方法源,那么大家可以看得出老师呢已经提前给大家整理好。我们对于native方法,你START0了以后没有什么返回值,这个时候其12元调的是GVM层面要启动G2的一个线程,所以GVM,那么它就是介于硬件和操作系统之间,由它来提供调度。好,这是我们第二步,请大家跟着走。
08:12
那么呢,第三一个回到我们的GVM.cpp,那么大家可以看得出交给GVM对吧,要启动一个线程,那么回到GVM这他又干了一些什么事呢?请看start,我们的线程走走走走走,隔到这了以后,它这个源代码很长,那么大概在2000多行,有个线程叫staff,大家请看媒体52的前面我们讲过线程和进程这种概念是操作系统级别的,所以说回到我们这儿,我们这儿呢也找好那么大概。是两。千800多行,那么大家请看这有个线程start,哎,传的是一个什么本地native体无线程,这个是操作系统所能够赋予和提供的,那么最终我们答案lawyer,它这儿干完以后,来我们前面强调过,再来看这句话,是不是一个Java就对应着一个C啊,哎,一样,你有thread。
09:08
点Java也一样,有thad.cpp这个呢,都是C语言的相关的底层知识,那么一点开,请大家看上一个我们是不是看到了它是不是线程start,那么在这儿是不是线程start,最终我们大家可以看出在464行是OS操作系统级别给你提供分配的一个线程,这有注释初始化这个线程状态不让它变成是吧,Reable在开始使用这个线程执行。所以说从这我们可以得到一个结论,对于我们的START0这个方法的native实质而言是由通过GVM配合操作系统底层,由操作系统来给他分配了一个原生的。基础线程来帮助你来启动,哎,这个就是我们一个线程从start开始你能获得的一个概念,好,那么这一讲就给答案介绍到这儿。
我来说两句