线程状态

有人能解释一下 VisualVM 中 SleepingWaitParkMonitor线程状态之间的区别吗。

enter image description here

以下是我的发现:

线程仍在运行。
线程正在休眠(在线程对象上调用了方法屈服点())
Wait: 线程被互斥体或屏障阻塞,正在等待另一个线程释放锁
停放的线程暂停,直到他们得到许可。取消停放线程通常通过在线程对象上调用方法 unpark ()来完成
Monitor: 线程正在等待一个条件变为真,以恢复执行

我不能理解的是州立公园,到底是什么挂了线?如何在代码中检测是什么使线程暂停执行?

有人能在这方面指导我吗。

谢谢。

35723 次浏览

I found a very nice diagram which pretty much describes all you need/want to know.

enter image description here

  1. New

The thread is in new state if you create an instance of Thread class but before the invocation of start() method.

  1. Runnable

The thread is in runnable state after invocation of start() method, but the thread scheduler has not selected it to be the running thread.

  1. Running

The thread is in running state if the thread scheduler has selected it.

  1. Timed waiting

Timed waiting is a thread state for a thread waiting with a specified waiting time. A thread is in the timed waiting state due to calling one of the following methods with a specified positive waiting time:

  • Thread.sleep(sleeptime)
  • Object.wait(timeout)
  • Thread.join(timeout)
  • LockSupport.parkNanos(timeout)
  • LockSupport.parkUntil(timeout)
  1. Non-Runnable (Blocked)

This is the state when the thread is still alive, but is currently not eligible to run.

  1. Terminated

A thread is in terminated or dead state when its run() method exits.

Hopefully this answers your question :).

Parking:

Disables the current thread for thread scheduling purposes unless the permit is available.

Threads are being parked or suspended if you like to call it this way because it does not have a permission to execute. Once permission is granted the thread will be unparked and execute.

Permits of LockSupport are associated with threads (i.e. permit is given to a particular thread) and doesn't accumulate (i.e. there can be only one permit per thread, when thread consumes the permit, it disappears).

VisualVM maps the Java thread state (as described in @Maciej's answer) to the state presented in its UI as follows:

BLOCKED -> Monitor
RUNNABLE -> Running
WAITING/TIMED_WAITING -> Sleeping/Park/Wait (see below)
TERMINATED/NEW -> Zombie

Sleeping and Park are specific cases of (timed) waiting:

Sleeping: specifically waiting in Thread.sleep().
Park:     specifically waiting in sun.misc.Unsafe.park() (presumably via LockSupport).

(The mapping is performed in ThreadMXBeanDataManager.java.)

A brief (and non-authoritative) discussion of Java thread state can be found here.

EDITED TO ADD:

It's also worth noting that threads blocking in calls to native methods appear in the JVM as RUNNABLE, and hence are reported by VisualVM as Running (and as consuming 100% CPU).