Java并发编程-线程基础( 三 )


2.1.3 线程的状态堆栈? 运行该示例 , 打开终端或者命令提示符 , 键入“ jps ” ,( JDK1.5 提供的一个显示当前所有 java 进程 pid 的命令) ? 根据上一步骤获得的 pid, 继续输入 jstack pid (jstack是 java 虚拟机自带的一种堆栈跟踪工具 。 jstack 用于打印出给定的 java 进程 ID 或 core file 或远程调试服务的 Java 堆栈信息)
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 文件 ,

Java并发编程-线程基础文章插图
  • 如上图 , 我们本地下载 jdk 工程 , 找到 src->share->native->java->lang->Thread.c 文件

Java并发编程-线程基础文章插图