Java的六种线程状态
在JDK中,Thread类定义了一个名为State的Enum类型,代表线程的状态,他们分别是:
New,Runnable,Blocked,Waiting,Timed_Waiting,Terminated
在线程执行的过程中,这些状态会相互转换,为了比较直观的了解,我根据JDK文档画了个状态图:
接下来我们一个一个看(以下内容均根据JDK文档编写)
New
当线程刚被创建还没开始运行时
Runnable
线程调用start()方法后,等待JVM调度,可能在执行,也可能在等待。
注:这里的等待指的是等待调度,等待的是系统资源,如IO、CPU时间片,与sleep,lock的等待有着本质差别。
Blocked
1. 线程等待进入synchronized代码块或者synchronized方法
2. 在可重入的synchronized代码块中调用了wait()
Waiting
1. 线程拥有monitor之后,调用了wait(),当其他拥有该monitor的线程调用notify()或者notifyAll()时恢复Runnable
2. 线程调用了join(),当被join的线程执行结束时恢复Runnable
3. 调用了LockSupport.park(Object),当其他线程对该线程调用park或者interrupt时恢复Runnable
Timed_Waiting
线程调用了有时间限制的wait,join,sleep方法或者LockSupport的parkNanos,parkUtils方法,满足条件(参见waiting状态)或时间到后自动恢复到Runnable状态
Terminated
1. 线程run()方法正常执行结束
2. 线程执行过程中出现了异常中途退出