一、启动线程方法:start

在 Java 中需要创建线程就离不开 Thread 类。

在 Thread 中,线程的执行逻辑由 Thread#run 中定义的逻辑执行,如果直接调用 Thread#run 执行,代码如下:

  1. public class ThreadDemo {
  2. public static void main(String[] args) {
  3. Thread thread = new Thread(() -> {
  4. System.out.println("执行方法");
  5. });
  6. thread.run();
  7. }
  8. }

一样可以得到相同的执行结果,但是这时候 Thread 不在是一个线程,而是一个 Java 类。此时完成任务是同步的方法调用。

而真正启动一个线程来执行任务,需要调用 Thread#start 方法。代码如下:

  1. public class ThreadDemo {
  2. public static void main(String[] args) {
  3. Thread thread = new Thread(() -> {
  4. System.out.println("执行方法");
  5. });
  6. thread.start();
  7. }
  8. }

二、从源码角度看 start 方法做了什么事

2.1、Java 中 start 方法源码

image.png
从代码能够知道,真正执行 start 操作的是 start0() 方法,而该方法,是一个 native 方法,由 C 实现
image.png

2.2、C 中 start0() 方法

Thread 静态代码块中定义了 native 方法注册,代码如下: image.png 上述代码中的 registerNaties() 定义在了 Thread.c 文件中,相关定义如下: image.png 其中 start0 对应的方法为 JVM_StartThread,而 JVM_StartThread jvm.cpp 文件中

image.png
通过 C 源码能够知道 Java Thread#start 最终调用的是 os::start_thread 方法

JVM 为了屏蔽底层操作系统提供了不同的操作系统实现,所以
os::start_thread 针对不同操作系统有不同实现。相关实现如下:
image.png
在调用系统启动线程方法后,最终调用 Thread.cpp 中的 javaThread::run 方法
image.png