分析java堆栈跟踪,正在运行什么线程

ric*_*chs 1 java multithreading multicore stack-trace

我正在分析java中的堆栈跟踪转储,并且不知道我怎么知道哪些线程实际上正在运行.我看到一个线程的方式是运行,等待锁,睡觉或等待安排.

在我的堆栈跟踪中,我看到以下状态

java.lang.Thread.State: WAITING (on object monitor)
java.lang.Thread.State: RUNNABLE
java.lang.Thread.State: TIMED_WAITING (sleeping)
java.lang.Thread.State: WAITING (parking)
java.lang.Thread.State: TIMED_WAITING (parking)
Run Code Online (Sandbox Code Playgroud)

首先,这些状态到底意味着什么?

其次,我有11个线程,runnable其中两个正在等待条件.这是否意味着9个线程同时运行?这似乎不可能,因为我的机器没有那么多的核心.

Joh*_*int 6

该术语Runnable可能并不意味着"当前正在运行",而是"处于运行状态".您所提到的差异在于,在任何给定时间可以运行的最大线程数等于您的核心数.

要更详细地了解它,您需要知道其他两个意思. WAITING意味着一个线程已被挂起在某个对象上.

while(<condition holds>)
    obj.wait()
Run Code Online (Sandbox Code Playgroud)

这里,当前线程当前WAITING在obj的监视器上.这将强制该线程被挂起,OS可以在其中安排另一个线程运行.

TIMED_WAITING 只是暂停一个线程一段时间.

因此,如果一个线程没有waitsleep它正在被认为是running.

从文档中获得更多见解.

可运行线程的线程状态.处于可运行状态的线程正在Java虚拟机中执行,但它可能正在等待来自操作系统的其他资源,例如处理器.

最后一部分是我认为你正在寻找的.物理上,OS不能并行运行更多线程而不是核心数量.
所有9个线程可以并发n运行,但只能并行运行(n即核心数).

类似的是 Condition.await

编辑:

对不起富人 - 应该链接我的资源http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Thread.State.html#RUNNABLE