Python 线程生命周期详解:从新建到死亡的五个状态

Dylan
Dylan
发布时间:2026-10-14 | 6人浏览过
原创

本文详细解析 Python 中线程的五个生命周期状态:新建、就绪、运行、阻塞和死亡。文章阐述了线程通过 start() 方法进入就绪状态,经 CPU 调度进入运行状态,以及在调用 sleep、等待锁或 notify 时进入阻塞状态的机制。同时说明了线程正常结束或发生异常导致的死亡状态,以及主线程与子线程的独立性。

Python 线程生命周期概述

在多线程程序中,CPU 资源并非由单一线程独占,而是通过时间片轮转等方式,轮流分配给各个线程执行。

线程从创建到最终消亡的整个生命周期中,通常会经历五种不同的状态:新建(New)、就绪(Ready)、运行(Running)、阻塞(Blocked)和死亡(Dead)。

线程的新建与就绪状态

线程的新建状态

无论通过直接实例化 Thread 类,还是通过继承 Thread 类的子类来创建线程,只要尚未调用 start() 方法,该线程就处于新建状态。在此阶段,线程对象已存在,但尚未获得 CPU 执行权,不会开始执行。

线程的就绪状态

当新建状态的线程调用 start() 方法后,它便从新建状态转换至就绪状态。

就绪状态意味着线程已经具备了执行条件,已向操作系统表明自己可以运行。然而,具体何时开始执行,完全取决于操作系统的 CPU 调度策略和时机。

换言之,处于就绪状态的线程仅表示“准备就绪”,随时等待 CPU 分配时间片。调用 start() 方法并不保证线程会立即获得 CPU 执行权,它只是进入了等待调度的队列。

线程的运行状态与 CPU 调度

线程的运行状态

当处于就绪状态的线程成功获得 CPU 时间片,并开始执行 target 参数指定的目标函数或重写后的 run() 方法时,该线程即进入运行状态。

若系统中存在多个处于就绪状态的线程,当前运行的线程并不能永久占用 CPU。为确保其他线程也能获得执行机会,操作系统会在一定时间后强制当前运行的线程让出 CPU 资源,使其回到就绪状态等待下一次调度。

线程的阻塞状态及唤醒机制

线程的阻塞状态

在多线程调度过程中,若线程获得 CPU 但尚未执行完毕,或因特定原因无法继续执行,便会进入阻塞状态。

现代桌面及服务器操作系统普遍采用抢占式优先级调度策略。系统为每个就绪线程分配固定的时间片,当时间片耗尽,无论任务是否完成,系统都会暂停该线程对 CPU 的使用,转而调度其他线程。

具体选择哪个就绪线程投入运行,取决于操作系统采用的调度算法,常见的包括先进先出(FIFO)、时间片轮转(Round Robin)以及优先级调度等。不同算法各有优劣,适用于不同的应用场景。

此外,处于运行状态的线程若遇到以下特定情形,也会主动或被动地转入阻塞状态:

  1. 线程调用了 sleep() 方法,主动挂起指定时间;
  2. 线程处于等待接收用户输入数据的阻塞式 I/O 操作;
  3. 线程试图获取某个对象的同步锁(如使用 synchronized 或 Lock),但该锁当前被其他线程持有,导致当前线程无法获取锁而阻塞;
  4. 线程调用了 wait() 方法,进入等待队列,直到满足特定条件或被通知唤醒。

上述四种情况均会导致线程进入阻塞状态。只有当导致阻塞的原因消除(如时间到期、数据就绪、锁释放或收到通知)后,线程才会从阻塞状态转换回就绪状态,重新参与 CPU 调度。

针对上述四种阻塞情况,其解除阻塞的具体措施如下:

  1. sleep() 方法设定的睡眠时间结束;
  2. 线程成功接收到了预期的用户输入数据;
  3. 其他线程释放了同步锁,且当前线程成功获取了该锁;
  4. 其他线程调用了 notify() 或 notifyAll() 方法发出唤醒通知。

线程的死亡状态与注意事项

线程死亡状态

线程在运行过程中,若因时间片用完等原因转入阻塞状态,待条件成熟后重新进入就绪状态,并继续争夺 CPU 资源,直至任务执行完毕。

一旦线程的任务逻辑执行完毕,该线程即进入死亡状态。

线程的结束不仅包括正常执行完毕,若在程序执行过程中发生未处理的异常(Exception)或错误(Error),线程也会提前进入死亡状态。

对于处于死亡状态的线程,需注意以下两点:

  • 主线程的死亡并不意味着所有子线程随之终止。主线程结束,子线程仍可继续独立运行;反之,子线程的死亡也不会直接导致主线程终止。
  • 对于已死亡的线程,无法再次调用 start() 方法使其重新启动。若尝试对死亡线程调用 start(),Python 解释器将抛出 RuntimeError 异常。

综上所述,本文详细介绍了 Python 线程的五个状态及其转换机制。如需了解更多关于 Python 线程状态的深入内容,建议参考本站其他相关文章。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表