我们都知道,一个线程直接对应了一个Thread对象,在刚开始学习线程的时候我们也知道启动线程是通过start()方法,而并非run()方法。
那这是为什么呢?
如果你熟悉Thread的代码的话,你应该知道在这个类加载的时候会注册一些native方法
public
class Thread implements Runnable {
/* Make sure registerNatives is the first thing <clinit> does. */
private static native void registerNatives();
static {
registerNatives();
}
}
一看到native我就想起了JNI,registerNatives()实际上就是java方法和C/C++的函数对应。在首次加载的时候就会注册这些native方法。Thread中有很多native方法,大家有兴趣的可以去看看。
关于JNI方法的命名,我们可以这样测试,我们用java声明一个native方法,然后先使用javac编译源文件(比如javac main.java),然后在使用javah即可生成头文件(javah main),打开这个头文件你就知道方法命名是如何的了
我们在JVM源码中搜索Java_java_lang_Thread_registerNatives可以看到registerNatives方法的具体实现
static JNINativeMethod methods[] = {
{
"start0", "()V", (void *)&JVM_StartThread},
{
"stop0", "(" OBJ ")V", (void *)&JVM_StopThread},
{
"isAlive", "()Z", (void *)&JVM_IsThreadAlive},
{
"suspend0", "()V", (void *)&JVM_SuspendThread},
{
"resume0", "()V", (void *)&JVM_ResumeThread},
{
"setPriority0", "(I)V", (void *)&JVM_SetThreadPriority},
{
"yield", "()V", (void *)&JVM_Yield},
{
"sleep", "(J)V", (void *)&JVM_Sleep},
{
"currentThread", "()" THD, (