根据 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 线程生命周期的状态机: