Java语言定义了6种线程状态。在任一时刻,某个线程处于且只能处于其中的一种状态。
- 新建(New):创建后尚未启动的线程。
- 运行(Runnable):正在执行或者正在等待操作系统分配执行时间的线程。
- 无限期等待(Waiting):不会被分配处理器执行时间,需要等待被其他线程显式唤醒。
- 限期等待(Timed Waiting):不会被分配处理器执行时间,也不需要等待其他线程唤醒,在一定时间之后会由系统自动唤醒。
- 阻塞(Blocked):等待着获取一个排他锁。
- 结束(Terminated):线程已经结束执行。
下图是线程6种状态的转换:
Java线程状态转换
在普通情况下,线程的生命周期经由箭头线方向执行,经历创建——运行——结束的过程。
如果执行过程遇到同步锁,在竞争锁失败的情况下,会执行箭头线方向,线程阻塞去等待同步锁的释放。
在线程执行中,主动执行了Object的等待/通知函数,或者线程的join方法,会执行箭头线方向,进入有限等待或者无限等待状态。
实践中,可以执行jstack命令查看线程状态。
网友评论