携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第17天,点击查看活动详情
第17天,我们来模拟一个简单的JVM_StartThread的这个方法。
我们搞的就是简单一点,pthread_create方法创建并启动一个原生线程,然后回调java层面的run方法。
创建并开启线程
我们直接在main方法中创建一个原生线程,如果你不知道原生线程的使用方法,可以man一下。
这里显示了它的头文件和用法,有四个参数:第一个就是线程,第二个是线程属性,我们设置为空,第三个参数写我们要执行的方法名,第四个参数是方法参数,我们置为空
代码如下:
编译通过gcc来编译:gcc mythread.c -o thread.out -pthread
到此,一个简单的main方法就完成了,运行结果如下:
回调run方法
回调的话我们通过jni技术来回调,首先我们编写下源代码:
然后我们把要加载的native方法对应的库加载进来:
然后生成.h文件,使用javah命令
这就是一个有jni入口的文件,那接下来就需要引入这个文件,实现这个方法。
然后需要把我们的c文件,打包成库文件,用gcc命令: 命令如下,这里需要引入两个库,在.h文件里都是标好的:
打成库文件,如下:
最终效果如下:
总结
我们来回顾一下:java里面写了native方法,然后你会加载这个.so的这个库,找到jni方法的入口,然后我们在.c文件中引入了这个入口,实现了这个方法,就是调用操作系统创建线程,打印我们的方法,这就是start0方法的原理。