JAVA线程的生命周期状态
一、线程的生命周期图示
二、Java线程的状态
2.1 Thread里的枚举State
在Java.lang.Thread里,有个内部枚举: State,一个线程在某一时刻可以是State里的一种状态。
public enum State {
/**
* 线程还没有被启动(start)的状态
*/
NEW,
/**
* 线程可以被JVM执行的状态
*/
RUNNABLE,
/**
* 线程由于监控锁被阻塞的状态
*/
BLOCKED,
/**
* 线程被无限期等待的状态
*/
WAITING,
/**
* 线程等待指定的时间
*/
TIMED_WAITING,
/**
* 线程被终止的状态
*/
TERMINATED;
}
2.2 NEW
已经创建了一个线程,但是还未被启动的状态。由于一个线程实例只能被启动一次,因此每个线程在线程的生命周期中只可能有一次处于NEW状态。
2.3 RUNNABLE
其实当线程处于RUNNABLE状态的时候,并不代表该线程已经在运行了。我们可以拆分成两个状态:READY和RUNNING。前者表示可以被线程调度器进行调度而处于RUNNING状态。后者表示该线程正在运行,如果在运行过程中,执行了Thread.yield(),其状态可能又变成了READY状态。
2.4 BLOCKED
一个线程发起了阻塞式I/O操作后,或者申请了一个已经被其他线程占有的独占锁时候,会处于BLOCKED状态。该状态下的线程并不会占用资源处理器。当阻塞式I/O操作完成后,或者其获取到独占锁的时候,就会变成RUNNABLE状态。
2.5 WAITING
一个线程执行了某些特定方法后,就会处于这种等待其他线程执行完另外一些特定操作的状态。
2.6 TIMED_WAITING
和WAITING状态类似,只不过该状态不会无限期等待其他线程执行完另外一些操作而已,而是到时间就会自动转化成RUNNABLE状态。
2.7 TERMINATED
已经结束的线程处于此种状态。一个线程实例只能被启动一次,也就意味着一个线程在线程的生命周期中只可能有一次处于TERMINATED状态。Thread.run()正常返回或者在执行过程中抛出异常都有可能使线程处于此状态。