6种线程状态
- NEW:创建后尚未启动的线程处于这种状态。不会出现在Dump中。
- RUNNABLE:运行。就绪,等待获取CPU的使用权。运行中,在虚拟机内执行的。
- BLOCKED:受阻塞并等待监视器锁。
- WATING:无限期等待另一个线程执行特定操作。
- TIMED_WATING:有时限的等待另一个线程的特定操作。
- TERMINATED:已退出的。
状态转换
使得线程变成waitting状态有以下几种方法:
- 调用Object对象的wait方法,但没有指定超时值。
- 调用Thread对象的join方法,但没有指定超时值。
- 调用LockSupport对象的park方法。
使得线程变成timed_waitting状态有以下几种方法:
- 调用Thread.sleep方法。
- 调用Object对象的wait方法,指定超时值。
- 调用Thread对象的join方法,指定超时值。
- 调用LockSupport对象的parkNanos方法。
- 调用LockSupport对象的parkUntil方法。
使得线程变成blocked状态有以下方法:
- 进入一个synchronized代码块失败
- 进入一个synchronized方法失败
- 在调用了object.wait之后,被其他线程object.notify唤醒之后,重新进入同步代码块或者同步方法失败。
Monitor(管程)
略…
Jstack 的使用
Jstack是Jdk自带的线程跟踪工具,用于打印指定Java进程的线程堆栈信息。
参数说明
jstack -l [pid]
调用修饰
表示线程在方法调用时,额外的重要的操作。线程Dump分析的重要信息。
locked <地址> 目标:使用synchronized申请对象锁成功,监视器的拥有者。
waiting to lock <地址> 目标:使用synchronized申请对象锁未成功,在入口等待队列中等待。
waiting on <地址> 目标:使用synchronized申请对象锁成功后,释放锁开始在资源等待队列中等待。
parking to wait for <地址> 目标:park是基本的线程阻塞原语,不通过监视器在对象上阻塞。随concurrent包会出现的新的机制,与synchronized体系不同。