在 java.lang.Thread.State 中,总共定义了六种状态:
-
NEW
线程对象被创建,但是未启动,未调用 start 方法
-
RUNNABLE
RUNNABLE 这个状态只是表示线程是可运行的。
就绪 ready 和运行中 running 两种状态笼统地称为 RUNNABLE。
-
BLOCKED
线程处于阻塞状态,正在等待一个监视器锁。
通常情况下,是等待进入 synchronized 同步方法块或者方法,
或者是处于 Object.wait 状态等待重新进入 synchronized 同步方法块或者方法
一个线程调用 Object.wait 不带超时参数的方法,此时会进入 WAITING 状态,当另一个线程调用 Object.notify 或者 Object.notifyAll 方法后,在这个线程退出 synchronized 块之前,wait 的那个线程的状态由 WAITING 变为 BLOCKED
-
WAITING
等待状态,调用以下方法可能会导致一个线程处于等待状态:
Object.wait 不带超时参数
Thread.join 不带超时参数
LockSupport.park
一个线程处于等待状态,通常是等待另一个线程来唤醒。
调用 Object.wait 的线程等待 Object.notify 或者 Object.notifyAll
调用 Thread.join 的线程等待另一个线程执行完毕
-
TIMED_WAITING
线程等待指定的时间,对于以下方法的调用,可能会导致线程处于这个状态:
Thread.sleep 带有超时参数
Object.wait 带有超时参数
Thread.join 带有超时参数
LockSupport.parkNanos
LockSupport.parkUntil
-
TERMINATED
线程终止
这些状态中 NEW 状态是开始,TERMINATED 时销毁,在整个线程对象的运行过程中,这个两个状态只能出现一次。其他任何状态都可以出现多次,彼此之间可以相互转换。
经常有人把线程的状态又称为线程的生命周期。个人认为这种叫法并不好,因为生命周期通常指的是一个对象从创建到销毁所必须要经历的过程。
例如 J2EE 的 Servlet 的生命周期方法是 init->service->destroy,这三个阶段是必须要经历的。
对于线程而言,完全可以 NEW 了之后就直接到 TERMINATED 了,或者只经历其中某些状态而不是所有。
总之,需要知道的一点是,别人和你提到线程状态或者是线程生命周期,其实指的是同一个东西。
网上有很多人说是五种,五种其实是跟据操作系统层面来划分的。
分别是新建、就绪、运行中、阻塞、死亡
新建状态,刚创建出线程
就绪,没有获得 CPU 时间片
运行中,获得 CPU 时间片,正在执行
阻塞,IO 阻塞、Object.wait 对操作系统来说都属于阻塞
死亡,线程执行完毕后