jvm层面的JVM_StartThread源码笔记

313 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详情

第16天,我们来解析一下这个JVM_StartThread的这个方法。

JVM_StartThread

这个注释说了,从jdk5开始,java的线程状态就用来防止重新启动线程,因此线程不能重新启动,否则会抛出异常。 image.png

这里是创建一个java线程,取名叫native线程 image.png

我这一点,卧槽这么多文件,如果你也和我一样不知道是哪个,那就打断点叭,还记得我们的断点调试嘛?来玩一下:

现在程序在mian方法的入口,我们打断点在2851行,然后跳到这里 image.png

我们到这行,然后进入这个方法 image.png

跳到了thread.cpp的第1562行 image.png

是不是这个方法,我们点回去看看 image.png

接着往下跟,这里有个设置入口点的方法,这个入口点不就是我们传过来的入口点&thread_entry嘛?

image.png

那这个&thread_entry指向的是谁呢,不就是我们线程里的run方法嘛。

image.png

创建线程

这里就是操作系统创建线程的方法,我们点进去 image.png

这里和创建main线程那个相似,也是创建一个osthread image.png

然后就是和内核线程做关联,最后映射到java线程上。

image.png

创建内核线程,然后调用java_start方法 image.png

java_start

这里有行注释:对于所有新创建的线程来说呢,都要调用这个方法 image.png

到这里会把os线程的状态设置为初始,然后呢,如果它的状态还是初始,就原地循环等待 image.png

如果状态改变呢,就执行run方法

image.png

返回了,线索中断了,那状态是啥条件下触发修改的呢?我们得重回到出发点,看看我们漏了什么。

启动线程

和java一样,创建线程,也要启动线程,所以我们找启动线程的方法:

image.png

然后看是不是java线程,是就修改状态为runnable。

image.png

然后启动原生线程:

image.png

修改原生线程状态,这个时候线程就不卡死,java就执行run方法了:

image.png

run方法有有一个方法是下面这个方法

image.png

然后调用entry_point回调java线程的run方法。

image.png