博客主页:https://blog.csdn.net/GBS20200720
博主昵称:怎么又有bug单
主要领域:Java、Linux、K8S
期待大家的关注点赞收藏⭐留言
今天给大家看一下,从最简单的一个start启动一个线程。能获得什么知识?结合jvm和操作系统底层的运作、结合C++源代码的分析来给大家介绍一个线程是如何起来的。
到Thread线程内部第696行,这儿我们可以看得出所有的start其实调用到的是Thread.java这个类。然后它调用了这么一个同步的start方法,也就说这个线程必须要全部走完,对吧?再往下看所有的方法实质而言调用的是start0这个方法。
在这儿有一个布尔值first start0,这个方法调用完成以后,马上变成代表启动成功,那么所谓的start0又是什么呢?学过jvm的知识的同学,有这个知识背景的都会了解,native代表的是本地接口的调用,调的是第三方c语言所编写的底层函数或者是操作系统。我们大家都清楚,从操作系统这个角度,在任务管理器里面,你就是没有装jdk,它也有操作系统级别的进程和线程,有进程必然会有线程。得到第一个结论,对于多线程、他跟语言没有太多关系,是操作系统层面所给的。
所以说启动以后,接下来就要看看。换以前可能就到这儿,到native也就到头了。反正到这儿明白了,start是调一个start0,要用的是底层的native函数。那么这个底层native又是什么呢?接下来我们进行一下源码的分析和讲解。
JAVA线程要理解,就必须谈及到一个概念叫open JDK ,JAVA源代码中更底层的源代码。
对于JAVA历史知道的同学都清楚,Java语言的前身其实就是C++。由于C++太过于强大,于是把一些复杂的功能做了一些简化,相当于这门语言就把它减减了一些复杂的概念,就变成了JAVA这门语言。所以说JAVA的上手要比C++舒服。
所以说openJDK就是C++对JAVA语言的描述和说明。
所以图中可以看到,java代码中native方法start0,其实就对应openJDK源码中的Thread::start。
464行可以看到
os::start_thread(thread);
os就是operate System,也就是操作系统。这也应征了我们之前的理论,多线程并非与语言强关联,而是编程语言对操作系统的调用。



