java - 分析java堆栈跟踪,正在运行哪些线程

标签 java multithreading stack-trace multicore

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

相关文章:

java - 使用线程的后台进程

android - 是否有开源 Android 应用公开其崩溃报告?

java - 如何找出 Java 程序在启动时使用了哪些库?

java - 计算这个具体算法的时间复杂度

java - 为什么此 Java 代码为现有键值打印 null?

java - 如何禁用 undertow 的自动配置

python - boost.python C++ 多线程

java - JNI 调用.NET dll

ios - Apple 的 Advanced NSOperations 示例代码中的竞争条件

javascript - 为什么 console.trace() 结果以 "anonymous function"结尾?那个功能是什么?