Java并发编程-线程基础( 三 )
2.1.3 线程的状态堆栈? 运行该示例 , 打开终端或者命令提示符 , 键入“ jps ” ,( JDK1.5 提供的一个显示当前所有 java 进程 pid 的命令) ? 根据上一步骤获得的 pid, 继续输入 jstack pid (jstack是 java 虚拟机自带的一种堆栈跟踪工具 。 jstack 用于打印出给定的 java 进程 ID 或 core file 或远程调试服务的 Java 堆栈信息)
文章插图
3. 线程的深入解析3.1 线程的启动原理
- 前面我们通过一些案例演示了线程的启动 , 也就是调用 start() 方法去启动一个线程 , 当 run 方法中的代码执行完毕以后 , 线程的生命周期也将终止 。 调用 start 方法的语义是当前线程告诉 JVM, 启动调用 start 方法的线程 。
- 我们开始学习线程时很大的疑惑就是 启动一个线程是使用 start 方法 , 而不是直接调用 run 方法 , 这里我们首先简单看一下 start 方法的定义 , 在 Thread 类中
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 {//线程调用的核心方法 , 这是一个本地方法 , nativestart0();started = true;} finally {try {if (!started) {group.threadStartFailed(this);}} catch (Throwable ignore) {/* do nothing. If start0 threw a Throwable thenit will be passed up the call stack */}}}//线程调用的 native 方法private native void start0();
- 这里我们能看到 start 方法中调用了 native 方法 start0来启动线程 , 这个方法是在 Thread 类中的静态代码块中注册的 , 这里直接调用了一个 native 方法 registerNatives
/* Make sure registerNatives is the first thing does. */private static native void registerNatives();static {registerNatives();}
- 由于 registerNatives 方法是本地方法 , 我们要看其实现源码则必须去下载 jdk 源码 , 关于 jdk 及虚拟机 hotspot 的源码下载可以去 openJDK 官网下载, 参考:
- 我们可以本地查看源码或者直接去查看 Thread 类对应的本地方法 .c 文件 ,
文章插图
- 如上图 , 我们本地下载 jdk 工程 , 找到 src->share->native->java->lang->Thread.c 文件
文章插图
- 上面是 Thread.c 中所有代码 , 我们可以看到调用了 RegisterNatives 同时可以看到 method 集合中的映射 , 在调用本地方法 start0 时 , 实际调用了 JVM_StartThread, 它自身是由 c/c++ 实现的 , 这里需要在 虚拟机源码中去查看 , 我们使用的都是 hostpot 虚拟机 , 这个可以去 openJDK 官网下载 , 上述介绍了不再多说
- 我们看到 JVM_StartThread 的定义是在 jvm.h 源码中 , 而 jvm.h 的实现则在虚拟机 hotspot 中 , 我们打开 hotspot 源码 , 找到 src -> share -> vm -> prims ->jvm.cpp 文件 , 在 2955 行 , 可以直接检索 JVM_StartThread , 方法代码如下:
推荐阅读
- 计算机专业大一下学期,该选择学习Java还是Python
- 未来想进入AI领域,该学习Python还是Java大数据开发
- 机器人|万州区举办“中国梦科技梦”机器人编程大赛
- 学习大数据是否需要学习JavaEE
- 从事Java开发时发现基础差,是否应该选择辞职自学一段时间
- 2021年Java和Python的应用趋势会有什么变化?
- 普通大学计算机专业的本科生,该选择主攻前端还是Java
- 英特尔推出可检测代码错误的ControlFlag机器编程工具
- 可编程3D打印耗材可帮助普通3D打印机轻松实现多材料物品的制作
- Java语言会不会随着容器的兴起而衰落