重拾 Java 高并发:万字长文带你探索 Thread 类源码(一)

68 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 7 天,点击查看活动详情

1. 前言

Java 中,创建一个线程最简单的方法就是创建一个 Thread 对象,然后调用它的 start() 方法。今天,我们就一起从源码的角度来探索下 Thread 类。

2. Thread 类图

IDEA 我们先来看看 Thread 的类图:

image.png

  • Thread 类实现了 Runnable 接口
  • Runnable 在JDK 1.8中,被 @FunctionalInterface 注解标记为函数式接口

3. Thread类 源码分析(上篇)

3.1 Thread类定义

Thread 类在 java.lang 包下,Thread 类的定义如下所示:

public class Thread implements Runnable {
    // 省略
}

3.2 加载本地资源

private static native void registerNatives();
static {
    registerNatives();
}

首先 Thread 类定义了一个静态本地方法 registerNatives(),这个方法主要用来注册一些本地系统的资源。并在静态代码块中调用这个本地方法,确保在类初始化时已经注册好了系统资源。

3.3 Thread 类的成员变量

image.png

Thread 有上述这么些个成员变量,由于有点多,这里就不一一列举先了。大家有个印象就行了,后面我们分析源码的时候会对用到的成员变量进行讲解。

另外,从 Thread类 的成员变量,我们可以看出,Thread类本质上不是一个任务,它是一个实实在在的线程对象,在Thread 类中拥有一个 Runnable 类型的成员变量 target,而这个 target 成员变量就是需要在 Thread 线程对象中执行的任务。

3.4 Thread 的状态定义

Thread 类中定义了一个 State 枚举,用来表示 Thread 各个不同阶段的状态:

public enum State {
    NEW,
    RUNNABLE,
    BLOCKED,
    WAITING,
    TIMED_WAITING,
    TERMINATED;
}
  • NEW:初始状态,线程被构建,但是还没有调用start()方法
  • RUNNABLE:可运行状态,可运行状态可以包括:运行中状态和就绪状态
  • BLOCKED:阻塞状态,处于这个状态的线程需要等待其他线程释放锁或者等待进入synchronized
  • WAITING:表示等待状态,处于该状态的线程需要等待其他线程对其进行通知或中断等操作,进而进入下一个状态。 - TIME_WAITING:超时等待状态。可以在一定的时间自行返回。
  • TERMINATED:终止状态,当前线程执行完毕。