线程对象在不同的运行时期有不同的状态,状态信息就存在于Thread中的State枚举中,如下所示:
public enum State { /** * 至今尚未启动的线程处于这种状态. */ NEW, /** * 正在Java虚拟机中执行的线程处于这种状态. */ RUNNABLE, /** * 受阻塞并等待某个监视器锁的线程处于这种状态. */ BLOCKED, /** * 无限期地等待另一个线程来执行某一特定操作的线程处于这种状态. */ WAITING, /** * 等待另一个线程来执行取决于指定等待时间的操作的线程处于这种状态. */ TIMED_WAITING, /** * 已退出的线程处于这种状态. */ TERMINATED; }
NEW状态表示刚刚创建的线程,这种线程还没开始执行。等到线程的start()方法调用时,才表示线程开始执行。当线程执行时,处于RUNNALE状态,表示线程所需的一切资源都已经准备好了。如果线程在执行过程中遇到了synchronized同步块,就会进入BLOCKED阻塞状态,这时线程就会暂停执行,直到获得请求的锁。WAITING和TIMED_WAITING都表示等待状态,它们的区别是WAITING会进入一个无时间限制的等待,TIMED_WAITING会进入一个有时间限制的等待。WAITING的线程是在等待一些特殊的事件。比如,通过wait()方法等待的线程在等待notify()方法,而通过join()方法等待的线程则会等待目标线程的终止。一旦等到了期望的事件,线程就会再次执行,进入RUNNABLE状态。当线程执行完毕后,则进入TERMINATED状态,表示结束。
从NEW状态出发后,线程不能再回到NEW状态,同理,处于TERMINATED的线程也不能再回到RUNNABLE状态。
线程状态图如下所示: