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个线程同时运行?这似乎不可能,因为我的机器没有那么多的核心.
该术语Runnable可能并不意味着"当前正在运行",而是"处于运行状态".您所提到的差异在于,在任何给定时间可以运行的最大线程数等于您的核心数.
要更详细地了解它,您需要知道其他两个意思. WAITING意味着一个线程已被挂起在某个对象上.
while(<condition holds>)
obj.wait()
Run Code Online (Sandbox Code Playgroud)
这里,当前线程当前WAITING在obj的监视器上.这将强制该线程被挂起,OS可以在其中安排另一个线程运行.
TIMED_WAITING 只是暂停一个线程一段时间.
因此,如果一个线程没有wait或sleep它正在被认为是running.
从文档中获得更多见解.
可运行线程的线程状态.处于可运行状态的线程正在Java虚拟机中执行,但它可能正在等待来自操作系统的其他资源,例如处理器.
最后一部分是我认为你正在寻找的.物理上,OS不能并行运行更多线程而不是核心数量.
所有9个线程可以并发n运行,但只能并行运行(n即核心数).
类似的是 Condition.await
编辑:
对不起富人 - 应该链接我的资源http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Thread.State.html#RUNNABLE
| 归档时间: |
|
| 查看次数: |
4762 次 |
| 最近记录: |