开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 7 天,点击查看活动详情
1. 前言
Java 中,创建一个线程最简单的方法就是创建一个 Thread 对象,然后调用它的 start() 方法。今天,我们就一起从源码的角度来探索下 Thread 类。
2. Thread 类图
IDEA 我们先来看看 Thread 的类图:
- 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 类的成员变量
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:终止状态,当前线程执行完毕。