这里的本地方法栈 存的都是被 native 关键字 标记的方法的引用! 真正的本地方法 需要通过 JNI(Java Native Interface)去本地方法库中去调用。
当我们去查看 线程启动 调用的 start()方法时,会发现线程的真正启动是 调用了 start0() 这个方法。
public synchronized void start() { /** * This method is not invoked for the main method thread or "system" * group threads created/set up by the VM. Any new functionality added * to this method in the future may have to also be added to the VM. * * A zero status value corresponds to state "NEW". */ if (threadStatus != 0) throw new IllegalThreadStateException(); /* Notify the group that this thread is about to be started * so that it can be added to the group's list of threads * and the group's unstarted count can be decremented. */ group.add(this); boolean started = false; try { start0(); started = true; } finally { try { if (!started) { group.threadStartFailed(this); } } catch (Throwable ignore) { /* do nothing. If start0 threw a Throwable then it will be passed up the call stack */ } } } private native void start0();这种写法相当奇怪,因为正儿八经的Class 类中根本不能写类似于 抽象方法的东西(没有实现代码块),那么这其中的关键 就只能是 native 关键字了。
native : 凡是带了 native 关键字的,说明Java的 作用范围达不到了,要去调用 底层C语言的库! JNI作用:扩展 Java 的使用,融合不同的编程语言为 Java 所用,,最初是为了调用 C 和 C++的。
Java 诞生之初,C语言 和 C++ 是 最为主体的 编程语言,要想从中立足,就必须能和他们融为一体,借此来扩大自己的生态。就此,本地方法栈 就在 JVM 中孕育而生了。