我正在分析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个线程同时运行?这似乎不可能,因为我的机器没有那么多核心。
答案 0 :(得分:6)
术语Runnable
可能并不意味着“当前正在运行”,而是“处于运行状态”。您所提到的差异在于,在任何给定时间可以运行的最大线程数等于您的核心数。
要更详细地了解它,您需要知道其他两个意思。 WAITING
意味着一个线程已被挂起在某个对象上。
while(<condition holds>)
obj.wait()
这里,当前线程目前在obj的监视器上WAITING
。这将强制该线程被挂起,OS可以在其中安排另一个线程运行。
TIMED_WAITING
只是暂停线程一段时间。
因此,如果某个帖子不是wait
或sleep
,则会将其视为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
每个线程的完整堆栈将使您更好地了解每个线程的作用。如果当前在应用程序中没有工作,许多人将处于等待状态,阅读以接受其下一个工作。