携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第15天,点击查看活动详情
这是写多线程的第15天,时间过的真快啊,半个月过去了,今天带大家瞧一瞧这个线程的start方法的源码,加深一下了解,如果虚拟机分为两个层面,那无非就是java层面和C++层面,今天我们全面了解一下这两个层面的方法。
java层面
如果这个状态不是NEW状态,那就抛异常。
然后,把它放到这个线程组里面。
然后调用一个start0方法,如果这个方法调用失败,就把刚添加的线程从线程组中移除。
start0方法是一个native方法,在c++层面实现,那c++层面怎么知道start0对应的是哪个方法呢?这里有个静态代码块,虚拟机一加载这个类文件的时候,这个方法就会执行,把对应的方法都注册进去。
我们可以看到这个类是thread类,对应的就是thread.c文件。
c++层面
java通过jni来调用c++层面的这个registerNatives方法,方法名前面的java表示java层面,后面是包名java.lang.Thread下的注册方法
我们可以在这个方法里面看到一大堆这个native方法,第一个就是start0方法,第一个参数是方法名,对应的是方法签名,这个如果阅读过《深入了解java虚拟机》的人应该不陌生,这是表示没有参数,没有返回值的方法,那后面那个参数就是jvm里的方法的入口,那入口我们应该去jvm的c文件去找。
在2816行找到了这个方法,然后我们加个注释,start0方法入口,那找到这个方法我们就得慢慢分析一下这个方法,写不完了,下篇再说。