携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详情
第16天,我们来解析一下这个JVM_StartThread的这个方法。
JVM_StartThread
这个注释说了,从jdk5开始,java的线程状态就用来防止重新启动线程,因此线程不能重新启动,否则会抛出异常。
这里是创建一个java线程,取名叫native线程
我这一点,卧槽这么多文件,如果你也和我一样不知道是哪个,那就打断点叭,还记得我们的断点调试嘛?来玩一下:
现在程序在mian方法的入口,我们打断点在2851行,然后跳到这里
我们到这行,然后进入这个方法
跳到了thread.cpp的第1562行
是不是这个方法,我们点回去看看
接着往下跟,这里有个设置入口点的方法,这个入口点不就是我们传过来的入口点&thread_entry嘛?
那这个&thread_entry指向的是谁呢,不就是我们线程里的run方法嘛。
创建线程
这里就是操作系统创建线程的方法,我们点进去
这里和创建main线程那个相似,也是创建一个osthread
然后就是和内核线程做关联,最后映射到java线程上。
创建内核线程,然后调用java_start方法
java_start
这里有行注释:对于所有新创建的线程来说呢,都要调用这个方法
到这里会把os线程的状态设置为初始,然后呢,如果它的状态还是初始,就原地循环等待
如果状态改变呢,就执行run方法
返回了,线索中断了,那状态是啥条件下触发修改的呢?我们得重回到出发点,看看我们漏了什么。
启动线程
和java一样,创建线程,也要启动线程,所以我们找启动线程的方法:
然后看是不是java线程,是就修改状态为runnable。
然后启动原生线程:
修改原生线程状态,这个时候线程就不卡死,java就执行run方法了:
run方法有有一个方法是下面这个方法
然后调用entry_point回调java线程的run方法。