一、启动线程方法:start
在 Java 中需要创建线程就离不开 Thread 类。
在 Thread 中,线程的执行逻辑由 Thread#run 中定义的逻辑执行,如果直接调用 Thread#run 执行,代码如下:
public class ThreadDemo {
public static void main(String[] args) {
Thread thread = new Thread(() -> {
System.out.println("执行方法");
});
thread.run();
}
}
一样可以得到相同的执行结果,但是这时候 Thread 不在是一个线程,而是一个 Java 类。此时完成任务是同步的方法调用。
而真正启动一个线程来执行任务,需要调用 Thread#start 方法。代码如下:
public class ThreadDemo {
public static void main(String[] args) {
Thread thread = new Thread(() -> {
System.out.println("执行方法");
});
thread.start();
}
}
二、从源码角度看 start 方法做了什么事
2.1、Java 中 start 方法源码
从代码能够知道,真正执行 start 操作的是 start0() 方法,而该方法,是一个 native 方法,由 C 实现
2.2、C 中 start0() 方法
Thread 静态代码块中定义了 native 方法注册,代码如下:
上述代码中的 registerNaties() 定义在了 Thread.c 文件中,相关定义如下:
其中 start0 对应的方法为 JVM_StartThread,而 JVM_StartThread 在 jvm.cpp 文件中
通过 C 源码能够知道 Java Thread#start 最终调用的是 os::start_thread 方法
JVM 为了屏蔽底层操作系统提供了不同的操作系统实现,所以 os::start_thread 针对不同操作系统有不同实现。相关实现如下:
在调用系统启动线程方法后,最终调用 Thread.cpp 中的 javaThread::run 方法