TIMED_WAITING:J.U.C中很多与线程相关类,都提供了限时版本和不限时版本的API 。TIMED_WAITING意味着线程调用了限时版本的API,正在等待时间流逝 。当等待时间过去后,线程一样可以恢复运行 。如果线程进入了WAITING状态,一定要特定的事件发生才能恢复运行;而处在TIMED_WAITING的线程,如果特定的事件发生或者是时间流逝完毕,都会恢复运行 。
TERMINATED:线程执行完毕,执行完run方法正常返回,或者抛出了运行时异常而结束,线程都会停留在这个状态 。这个时候线程只剩下Thread对象了,没有什么用了 。根据dump日志分析下面我们根据实际的代码 来分析dump日志,可以更加透明的了解线程为什么是这个状态
例子1:等待释放锁
package jstack;public class BlockedState{private static Object object = new Object();public static void main(String[] args){Runnable task = new Runnable() {@Overridepublic void run(){synchronized (object){long begin = System.currentTimeMillis();long end = System.currentTimeMillis();// 让线程运行5分钟,会一直持有object的监视器while ((end - begin) <= 5 * 60 * 1000){}}}};new Thread(task, "t1").start();new Thread(task, "t2").start();}}
先获取object的线程会执行5分钟,这5分钟内会一直持有object的监视器,另一个线程无法执行处在BLOCKED状态"t2" prio=6 tid=0x27d7a800 nid=0x1350 waiting for monitor entry [0x2833f000]java.lang.Thread.State: BLOCKED (on object monitor)at jstack.BlockedState$1.run(BlockedState.java:17)- waiting to lock <0x1cfcdc00> (a java.lang.Object)at java.lang.Thread.run(Thread.java:662)"t1" prio=6 tid=0x27d79400 nid=0x1338 runnable [0x282ef000]java.lang.Thread.State: RUNNABLEat jstack.BlockedState$1.run(BlockedState.java:22)- locked <0x1cfcdc00> (a java.lang.Object)at java.lang.Thread.run(Thread.java:662)
【JVM Thread Dump 文件分析】通过thread dump可以看到:t2线程在BLOCKED (on object monitor) 。waiting for monitor entry 等待进入synchronized保护的区域,但obj对应的 Monitor 被其他线程所拥有,所以 JVM线程的状态是 java.lang.Thread.State: BLOCKED (on object monitor),说明线程等待资源 。推荐阅读
- ThreadLocal原理及使用场景大揭秘
- JVM生成的3种文件,你都见过吗?
- 建议收藏 一文深度讲解JVM 内存分析工具 MAT及实践
- Java堆和栈的区别和介绍以及JVM的堆和栈
- java安全编码指南之:Thread API调用规则
- JVM常见线上问题 → CPU 100%、内存泄露 问题排查
- Java性能调优:JVM性能监控常用方法
- 一次完整的JVM堆外内存泄漏故障排查记录
- 使用微软的 ProcDump 调试 Linux 进程
- 什么是线程池?线程池ThreadPoolExecutor使用及其原理又是什么?