# 线程的状态

线程的核心状态有 3 个:

  • 可执行(Runnable)
  • 执行中(Running)
  • 阻塞中(Blocking)

在加上线程创建之处的短暂的『新生』状态(Created)和销毁前的短暂的『僵尸』状态(Zombie),从而组成了最常见的线程的 5 种状态。

  • 新生状态:Created

    创建线程对象后,而又未调用其 Thread#start 方法之前,该线程处于这种状态。此时操作系统还未为其分配资源。

    此时只能启动和终止线程,任何而其他操作都会发生议程。

  • 可执行状态:Runnable

    当调用 Thread#start 之后,操作系统为该线程分配了所必须的资源,但是而又未获得 CPU 执行机会时,该线程处于这种状态。

    由于 CPU 时稀缺的公共资源,毫无疑问,在多线程程序中,任意时刻有大量的线程都是处于这种状态。

    通俗的说,这种状态就是『万事俱备,只欠东风』。

  • 执行状态:Running

    当前获得 CPU 资源,正在执行的线程,就是处于这种状态。

    对于单核 CPU 而言,一个进程中无论有多少线程,任意时刻有且仅有一个线程是处于该状态。

    同理,对于多核 CPU 而言,(全系统无论多少进程多少线程)N 核 CPU 有且仅有 N 个线程处于这种状态。

  • 阻塞状态:Blocked

    一个正在运行(Running)的线程因为某种原因代码逻辑无法再继续运行下去了,就进入阻塞状态。

    进入阻塞状态的线程会让出 CPU,因为即便它强占 CPU 也无法再继续运行下去。

    当造成该线程阻塞的原因小时后,该线程将又有机会运行。

    通俗的说,这种状态就是『除了欠东风,还欠别的』。

    导致一个线程阻塞最常见的原因有以下几个:

    • 调用了 Thread 类的静态方法 Thread#sleep ;

    • 线程执行 IO 时,无数据可读(或无空间可写);

    • 一个线程的执行需要获得一个『锁』,而此时锁正被别的线程占用。

  • 僵尸状态:Zombie

    一个线程在结束执行后(无论是正常执行完执行函数,还是被终止掉了),在系统回收分配给它的资源之前,该进程短暂地处于这种状态。