根据 Oracle 的官方文档 ,Java 线程有如下状态:
状态 | 描述 |
---|---|
NEW | 刚创建的新线程 |
RUNNABLE | 线程正在JVM内执行 |
BLOCKED | 线程阻塞在 monitor lock |
WAITING | 线程无限等待其他线程的某个特定动作 |
TIMED_WAITING | 同上,只是有时间限制 |
TERMINATED | 线程已经结束 |
不过,用 VisualVM 看的时候,我们会看到如下状态:
因为,VisualVM 对状态做了映射。根据StackOverflow 的解释:
Java | VisualVM |
---|---|
BLOCKED | Monitor |
RUNNABLE | Running |
WAITING/TIMED_WAITING | Sleeping/Park/Wait |
TERMINATED/NEW | Zombie |
其中:
VisualVM | Description |
---|---|
Sleeping | specifically waiting in Thread.sleep() |
Park | specifically waiting in sun.misc.Unsafe.park() via LockSupport |
如下操作会导致线程进入 TIMED_WAITING 状态:
- Thread.sleep(sleeptime)
- Object.wait(timeout)
- Thread.join(timeout)
- LockSupport.parkNanos(timeout)
- LockSupport.parkUntil(timeout)
不知道 VisualVM 为啥要做这种状态映射,估计是为了区分等待原因。最后,附上 Java 线程生命周期的状态机: