我正在分析 Java 中的堆栈跟踪转储,但不知道如何判断哪些线程正在实际运行。在我看来,线程要么正在运行,要么正在等待锁,要么正在 hibernate ,要么正在等待调度。
在我的堆栈跟踪中,我看到以下状态
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 个线程可运行
,其中两个正在等待一个条件。这是否意味着 9 个线程同时运行?这似乎不可能,因为我的机器没有那么多内核。
最佳答案
术语 Runnable
可能并不意味着“当前正在运行”,而是“处于运行状态”。您所避开的区别在于,在任何给定时间可以运行的最大线程数等于您的内核数。
要更详细地理解它,您需要知道其他两个是什么意思。 WAITING
表示线程已在某个对象上挂起。
while(<condition holds>)
obj.wait()
在这里,当前线程当前正在 obj 的监视器上 WAITING
。这将强制该线程挂起,操作系统可以在其中安排另一个线程运行。
TIMED_WAITING
只是将线程挂起一定时间。
因此,如果线程未等待
或 sleep
,则认为它正在运行
。
从文档中获得更多见解。
Thread state for a runnable thread. A thread in the runnable state is executing in the Java virtual machine but it may be waiting for other resources from the operating system such as processor.
我认为您正在寻找最后一部分。物理上,操作系统不能并行运行比内核数量更多的线程。
您的所有 9 个线程都可以同时运行,但只有 n
会并行运行(n
是核心数)。
对于Condition.await
也是如此
编辑:
对不起 richs - 应该链接我的资源 http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Thread.State.html#RUNNABLE
关于java - 分析java堆栈跟踪,正在运行哪些线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5543742/