线程的声明周期和状态

本文详细介绍了Java线程的六种状态及其转换过程,包括NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED。线程从新建到运行,再到等待、超时等待、阻塞,最终终止。理解这些状态对于优化并发程序至关重要。

Java 线程在运行的生命周期中的指定时刻只可能处于下面 6 种不同状态的其中一个状态(图源《Java 并发编程艺术》4.1.4 节)。
在这里插入图片描述

  • Java 线程的状态

线程在生命周期中并不是固定处于某一个状态而是随着代码的执行在不同状态之间切换。Java 线程状态变迁如下图所示(图源《Java 并发编程艺术》4.1.4 节):

在这里插入图片描述

  • Java 线程状态变迁

由上图可以看出:线程创建之后它将处于 NEW(新建) 状态,调用 start() 方法后开始运行,线程这时候处于 READY(可运行) 状态。可运行状态的线程获得了 CPU 时间片(timeslice)后就处于 RUNNING(运行) 状态。

操作系统隐藏 Java 虚拟机(JVM)中的 RUNNABLE 和 RUNNING 状态,它只能看到 RUNNABLE 状态(图源:HowToDoInJava:Java Thread Life Cycle and Thread States),所以 Java 系统一般将这两个状态统称为 RUNNABLE(运行中) 状态 。

RUNNABLE-VS-RUNNING

当线程执行 wait()方法之后,线程进入 WAITING(等待) 状态。进入等待状态的线程需要依靠其他线程的通知才能够返回到运行状态,而 TIME_WAITING(超时等待) 状态相当于在等待状态的基础上增加了超时限制,比如通过 sleep(long millis)方法或 wait(long millis)方法可以将 Java 线程置于 TIMED WAITING 状态。当超时时间到达后 Java 线程将会返回到 RUNNABLE 状态。当线程调用同步方法时,在没有获取到锁的情况下,线程将会进入到 BLOCKED(阻塞) 状态。线程在执行 Runnable 的run()方法之后将会进入到 TERMINATED(终止) 状态

### Java线程生命周期的各个阶段 #### 新建状态 (New) 当创建一个新的`Thread`对象实例时,线程就处于新建状态。此时线程还没有启动,也未调用`start()`方法[^2]。 #### 就绪状态 (Runnable) 一旦调用了线程的`start()`方法之后,线程就会进入就绪队列等待CPU时间片分配来执行。需要注意的是,在此状态下,线程可能因为调度算法的原因暂时无法获得处理器资源而未能真正开始执行;但这并不影响它被认为是“可运行”的一部分[^1]。 #### 运行状态 (Running) 当一个线程获得了CPU使用权并开始执行它的任务(即执行`run()`方法中的代码),则认为该线程正处于运行状态。这是唯一能够实际处理数据完成工作的有效工作状态[^3]。 #### 阻塞状态 (Blocked/Waiting/Timed Waiting) - **阻塞(Blocked)**: 当前线程试图获取某个已经被占用的对象锁时会被置于阻塞状态直到目标对象上的锁定被释放为止。 - **等待(Waiting)**: 调用不带超时参数的方法如`Object.wait()`, `Thread.join()` 或者在锁上等待通知(`LockSupport.park`)会使当前线程进入无限期等待状态,除非受到相应唤醒操作才会返回到就绪状态。 - **计时期待(Timed Waiting)** :通过带有指定时限的方式调用上述提到的一些函数或者直接使用`Thread.sleep(long millis)`可以让线程暂停一段时间后再重新变为就绪态[^4]。 #### 终止状态 (Terminated) 线程到达终止状态表明其生命已经结束,这可能是由于正常完成了所有的指令或是遇到了异常情况所引起的非正常退出。一旦达到这一最终状态,则不能再恢复成任何其他的活动形式,并且相关联的所有资源都将被回收[^5]。 ```java public class ThreadLifeCycleExample { public static void main(String[] args) throws InterruptedException { // 创建新线程 Thread thread = new Thread(() -> System.out.println("Thread is running")); // 此处thread处于NEW状态 // 启动线程使其进入RUNNABLE状态 thread.start(); // 主线程休眠以便观察子线程的变化 Thread.sleep(10); // 子线程可能会经历BLOCKED, WAITING或TIMED_WAITING等中间状态, // 最终会因run方法执行完毕而进入TERMINATED状态 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值