Thread之线程的状态

博客介绍了线程的生命周期。线程创建后进入新生状态,调用 start 方法进入就绪状态,获 CPU 后为运行状态。运行中可能因未执行完、调用 sleep 等进入阻塞状态,sleep 时间过则重回就绪状态,执行完毕进入死亡状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个线程从用 new 关键字和 Thread或其子类创建一个对象之后进入新生状态,然后通过调用start方法进入就绪状态,等到cpu进行调度,获取cpu之后就为运行状态,当获取的cpu一次未执行完毕,执行过程中失去了cpu,或者调用了 sleep,join,yield进入阻塞状态,如当 sleep时间过了则进入就绪状态等待获取cpu,执行完毕之后则为死亡状态

如图所示

<think>好的,用户现在想查看Java中Thread类的源码以及线程状态的相关信息,也就是需要关于Thread源码的分析和线程状态的详细解释。我需要结合之前的对话历史和相关引用内容来组织回答。首先,用户之前的问题是关于ArrayList的线程安全性及实现方式,现在转向Thread类和线程状态,这可能是在深入多线程编程的基础知识。用户提供的引用中提到了Thread类的继承、Runnable接口、线程池以及线程状态的相关信息,特别是引用[3]中提到了getState方法和线程状态的转换,这些需要详细展开。接下来,我需要确定用户的真实需求。用户可能正在学习Java多线程,想要了解Thread类的内部实现机制,以及线程状态是如何管理和转换的。这可能涉及到源码的结构、关键方法以及状态枚举的具体含义和转换条件。 首先,分析Thread类的源码结构。根据引用[3],Thread类中有getState方法,返回线程的状态,而状态是通过内部字段threadStatus和native方法转换的。需要解释Thread.State枚举的各个值,以及它们之间的转换关系。此外,用户可能对线程的生命周期和状态转换图感兴趣,需要绘制一个状态转换图来帮助理解。 然后,考虑用户可能存在的疑问点。例如,线程状态是如何被JVM管理的,NEW状态和RUNNABLE状态的区别,BLOCKED和WAITING状态的不同触发条件等。需要结合源码中的具体方法,如start(),wait(),notify(),join()等,来说明状态的变化。 还需要注意引用[2]中提到,Java线程分为用户线程和内核线程,创建线程的代价很高,因此有了线程池。虽然用户当前的问题是关于Thread源码和状态,但可能在后续问题中会涉及到线程池的使用,所以可以在相关问题的部分提出,引导用户进一步学习。另外,用户提供的引用[1]和[3]都提到了创建线程的两种方式:继承Thread类和实现Runnable接口。虽然用户当前的问题不直接涉及,但可能在源码分析中需要提到Thread的run方法是如何调用Runnable的target的,这部分可以简要说明。在回答结构上,应该先介绍Thread类的源码结构,然后详细分析各个线程状态,接着给出状态转换图,最后总结相关问题。需要确保每个部分都清晰,并引用提供的引用内容,比如在解释getState方法时引用[3],在提到线程创建代价时引用[2]。 还需要注意用户之前的问题中提到的线程安全,可能用户对多线程的状态同步机制也有兴趣,但当前问题集中在Thread类和状态本身,所以暂时不深入,但可以在相关问题中提及。最后,生成的相关问题需要与Thread源码和线程状态相关,比如源码中其他关键方法、状态转换的底层实现、设计模式的应用等,参考用户之前的提问风格,问题应具体且有深度。</think>### Java Thread 源码分析与线程状态详解 --- #### 一、Thread 源码结构解析 **1. 核心字段解析** ```java // 线程状态(底层使用int存储) private volatile int threadStatus; // 目标执行对象(实现Runnable接口的关键) private Runnable target; // 线程优先级(1-10) private int priority; ``` - `threadStatus`字段通过位掩码记录线程状态[^3] - `target`字段允许通过Runnable接口实现多态执行[^1] **2. 状态获取方法** ```java public State getState() { return sun.misc.VM.toThreadState(threadStatus); } ``` - 使用native方法`toThreadState`转换状态[^3] - 返回标准的`Thread.State`枚举值 --- #### 二、Java线程状态详解 **1. 状态枚举定义** ```java public enum State { NEW, // 已创建未启动 RUNNABLE, // 可运行(包含就绪和运行中) BLOCKED, // 等待监视器锁 WAITING, // 无限期等待 TIMED_WAITING,// 有时间限制的等待 TERMINATED; // 终止状态 } ``` **2. 状态转换条件** | 状态 | 触发条件 | |-----------------|--------------------------------------------------------------------------| | NEW → RUNNABLE | 调用`start()`方法[^1] | | RUNNABLE → BLOCKED | 进入`synchronized`代码块失败 | | RUNNABLE → WAITING | 调用`Object.wait()`或`Thread.join()` | | RUNNABLE → TIMED_WAITING | 调用`Thread.sleep()`或带超时的`wait()/join()` | | WAITING → RUNNABLE | 被`notify()/notifyAll()`唤醒或目标线程终止 | **3. 状态转换示意图** ``` $$ \begin{tikzpicture}[->,>=stealth',shorten >=1pt,auto,node distance=2.5cm] \node[state] (NEW) {NEW}; \node[state, right of=NEW] (RUNNABLE) {RUNNABLE}; \node[state, below of=RUNNABLE] (BLOCKED) {BLOCKED}; \node[state, left of=BLOCKED] (WAITING) {WAITING}; \node[state, left of=WAITING] (TIMED_WAITING) {TIMED\_WAITING}; \node[state, right of=RUNNABLE] (TERMINATED) {TERMINATED}; \path (NEW) edge node {start()} (RUNNABLE) (RUNNABLE) edge [loop right] node {yield()} (RUNNABLE) (RUNNABLE) edge node {synchronized失败} (BLOCKED) (RUNNABLE) edge [bend right] node {wait()/join()} (WAITING) (RUNNABLE) edge [bend left] node {sleep()} (TIMED_WAITING) (WAITING) edge [bend right] node {notify()} (RUNNABLE) (TIMED_WAITING) edge [bend left] node {超时} (RUNNABLE) (RUNNABLE) edge node {run()结束} (TERMINATED); \end{tikzpicture} $$ ``` --- #### 三、关键源码方法解析 **1. start() 方法** ```java public synchronized void start() { if (threadStatus != 0) throw new IllegalThreadStateException(); // 调用native方法启动线程 start0(); // 更新状态为RUNNABLE } ``` - 每个线程只能调用一次`start()`[^1] - 实际线程创建通过native方法`start0()`实现[^2] **2. run() 方法** ```java @Override public void run() { if (target != null) { target.run(); // 支持Runnable接口的核心逻辑[^1] } } ``` **3. join() 方法** ```java public final synchronized void join(long millis) { while (isAlive()) { wait(millis); // 调用者线程进入WAITING状态[^3] } } ``` --- #### 四、线程状态监控实践 **1. 实时状态查看示例** ```java Thread t = new Thread(() -> { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } }); System.out.println(t.getState()); // NEW t.start(); System.out.println(t.getState()); // RUNNABLE Thread.sleep(500); System.out.println(t.getState()); // TIMED_WAITING ``` **2. 状态监控工具** - `jstack`:生成线程快照 - VisualVM:图形化监控线程状态 - Java Mission Control:专业级线程分析 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值