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