jvm(java虚拟机)线程状态jstack(1)

1. 线程状态

jstack命令查看线程堆栈信息时可能会看到的线程的几种状态:

jvm(java虚拟机)线程状态jstack(1)_第1张图片

RUNNABLE,在虚拟机内执行的。运行中状态,可能里面还能看到locked字样,表明它获得了某把锁。包括等待CPU调度和正在运行的线程的状态;

BLOCKED,受阻塞并等待监视器锁。被某个锁(synchronizers)給block住了。处于synchronized同步代码块或方法中被阻塞;

WATING,无限期等待另一个线程执行特定操作。等待某个condition或monitor发生,一般停留在LockSupport.park(), Object.wait(), Thread.join() 等语句里。

TIMED_WATING,有时限的等待另一个线程的特定操作。和WAITING的区别是wait() 等语句加上了时间限制 wait(timeout)。通过下列带超时的方式:Thread.sleep、Object.wait、Thread.join、LockSupport.parkNanos、LockSupport.parkUntil。

其中新建状态和终止状态的线程在jstack是看不到的。

2. Monitor

在多线程的 JAVA程序中,实现线程之间的同步,就要说说 Monitor。 Monitor是 Java中用以实现线程之间的互斥与协作的主要手段,它可以看成是对象或者 Class的锁。每一个对象都有,也仅有一个 monitor。

jvm(java虚拟机)线程状态jstack(1)_第2张图片

进入区(Entrt Set):表示线程通过synchronized要求获取对象的锁。如果对象未被锁住,则迚入拥有者;否则则在进入区等待。一旦对象锁被其他线程释放,立即参与竞争。

拥有者(The Owner):表示某一线程成功竞争到对象锁。

等待区(Wait Set):表示线程通过对象的wait方法,释放对象的锁,并在等待区等待被唤醒。

你可能感兴趣的:(Java,jvm,线程状态,jstack)