Java线程状态
Java线程状态
java线程一共有6种状态
- New(新建)
- Runnable(可运行)
- Blocked(被阻塞)
- Waiting(等待)
- Timed waiting(计时等待)
- Terminated(终止)
转换关系图如下
说明如下:
- New:线程创建后但还没开始时的状态就是新建,即
new Thread()
后线程的状态就是新建,但还没调用start方法。 - Runnable:线程一旦调用
start()
方法,无论是否运行,状态都为Runable,但Runnable是从JVM视图看是处于执行状态,但实际上操作系统可能在等待一些资源,如此时处理器在干其他的,此时Runnable可以分成两个子状态Ready
和Running
,所以通过上图当线程被调度器选中执行实际才处于Running状态。所以显示Runable状态指示表示线程可以运行,不表示线程当下一定在运行,线程是否运行由虚拟机所在操作系统调度决定。 - Timed waiting:和wait一样,不过会在传入的时间之后或收到其他线程的通知都会恢复到可运行的状态。
- Waiting:当调用下面没有超时时间的方法是线程会转移到Waiting状态
Object.wait()
Thread.join()
LockSupport.park()
- Blocked:线程试图获取一个内部对象的
Monitor
(进入synchronized
方法或synchronized
块)但是其他线程已经抢先获取,那此线程被阻塞,直到其他线程释放Monitor
并且线程调度器允许当前线程获取到Monitor
,此线程就恢复到可运行状态。 - Terminated:线程执行完毕正常结束或执行过程中因未捕获异常意外终止都会是线程进入被终止状态。
验证DEMO
1 | public class ThreadState { |
输出结果
1 | 调用new方法后 my thread state:NEW |
参考资料:https://www.uml-diagrams.org/java-thread-uml-state-machine-diagram-example.html