龙空技术网

详细分析Java线程start背后的密码

春风不负韶华YB 763

前言:

此刻你们对“java线程start”大概比较重视,同学们都想要剖析一些“java线程start”的相关文章。那么小编在网络上汇集了一些对于“java线程start””的相关知识,希望咱们能喜欢,各位老铁们快快来了解一下吧!

下面这段代码Java实现了创建并启动一个线程,代码虽然简单,但是你知道它背后的密码吗?今天我们就一起来深入的研究一下这两行代码。

整体流程Thread的构造方法

首先我们看看第一行代码:new Thread()。这行代码调用了Thread的无参构造方法,下面是它的实现代码:

可以看出实际调用的是init方法,下面是删除注释和非关键代码的init方法:

可以看出,在init方法中主要是做了一些初始化工作:

初始化线程名称。获取当前线程作为新线程的父线程。计算线程IDThread.start()背后的故事

当我们实例化好一个线程以后,就可以调用Thread.start()方法来启动新线程。start方法的实现代码:

从上面的代码可以知道调用Thread.start()方法最终调用的是start0()这个native方法。所以想要进一步看看start0背后的秘密就需要进入c++代码中去。

start0函数的作用

根据以往的经验,想要找native方法Thread.start0()的c++代码,只需要全局搜索java_lang_Thread_start0()即可。然而,在这里并不能够直接搜索到。这是因为Thread类中的native方法并不是按照这种方式绑定的。

所以start0()对应的c++函数是JVM_StartThread。接着看看JVM_StartThread实现源码:

这段代码主要实现的功能:

计算线程栈的大小创建一个Java线程调用Thread:start函数启动线程

Java Thread在JVM中是一个非常重要存在,后续有机会在做进一步的分析。

c++类Thread的start方法功能

这个函数的功能比较简单,主要是设置了一下java线程的状态,然后就去调用os::start_thread函数了。

os::start_thread函数的功能

走到这里基本上各种初始化都已经完成,可以真正的启动系统线程了。不同的系统启动过程显然也是不一样的,所以pd_start_thread在不同系统有不同的实现。

标签: #java线程start #java 线程 start #java 线程start后状态 #javastart