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

时间:2011-04-04 20:09:19

标签: java multithreading stack-trace multicore

我正在分析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)

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

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

2 个答案:

答案 0 :(得分:6)

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

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

while(<condition holds>)
    obj.wait()

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

TIMED_WAITING只是暂停线程一段时间。

因此,如果某个帖子不是waitsleep,则会将其视为run ning。

从文档中提供更多见解。

  

可运行线程的线程状态。一个   处于可运行状态的线程是   在Java虚拟机中执行   但它可能在等待其他   来自操作系统的资源   比如处理器。

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

Condition.await

也是如此

编辑:

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

答案 1 :(得分:0)

查看此页面是否可以帮助您 http://download.oracle.com/javase/6/docs/api/java/lang/Thread.State.html

回答关于内核与线程数量的第二个问题。核心可以同时在其上运行多个线程。因此,#threads&gt; = #core

每个线程的完整堆栈将使您更好地了解每个线程的作用。如果当前在应用程序中没有工作,许多人将处于等待状态,阅读以接受其下一个工作。