Java多线程(4)-Thread的生命周期
Thread的生命周期
Java中的Thread类中还有一个内部枚举类STATE, 这个枚举代表了线程从始至终的状态,
NEW
指一个新创建的线程,还没有开始执行
RUNNABLE
处于该状态,意味着当前线程正在执行 或者 正在等待执行,甚至可能是在等待IO,
这里就会有一个疑问,如果线程在等待IO,难道不应该处于阻塞状态吗?
在JVM中,线程的阻塞状态(BLOCKED)用于表示另一种特殊的情况,而当线程调用IO时,发起一个Linux的open系统调用,
此时CPU发现该线程要进行IO操作,将会切换执行其他的线程,但是当前java线程虽然不被系统执行了,却还是处于RUNNABLE状态,
当IO事件完成后,会发出一个中断信号,CPU感知到中断信号的到来,将恢复该线程的执行,
此时该线程的状态依然是RUNNABLE状态,这个过程中虽然有IO阻塞,但是那是操作系统层面的阻塞,和JVM中的线程无关,所以从IO事件从始至终,该线程的状态都没有变过
BLOCKED
这个状态是指一个线程在等待 monitor lock , 也就是常见的锁关键字 synchronized, 也就是说这个线程在等待锁的时候会处于BLOCKED状态,和操作系统的阻塞没有关联
WAITING
一个线程调用了一下几个方法,将会处于该状态
Object.wait、Thread.join、LockSupport.park
TIMED_WAITING
一个线程调用了一下几个方法,将会处于该状态
Thread.sleep、Object.wait、Thread.join、LockSupport.parkNanos、LockSupport.parkUntil
WAITING 和 TIMED_WAITING 两个状态相关的触发方法涉及到Java多线程之间的协作同步,这个后面详细更新
TERMINATED
线程执行完成或被中断的时候 变成此状态
