为什么java执行中线程状态标记为RUNNABLE而不是RUNNING?

2013-06-18 12:33:43 +08:00
 andybest
A thread state. A thread can be in one of the following states:

NEW
A thread that has not yet started is in this state.
RUNNABLE
A thread executing in the Java virtual machine is in this state.
BLOCKED
A thread that is blocked waiting for a monitor lock is in this state.
WAITING
A thread that is waiting indefinitely for another thread to perform a particular action is in this state.
TIMED_WAITING
A thread that is waiting for another thread to perform an action for up to a specified waiting time is in this state.
TERMINATED
A thread that has exited is in this state.

参考:http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.State.html


对于RUNNABLE状态有点违反我的常识,既然是“A thread executing”,为什么不标记为RUNNING或者EXECUTEING?
那又为什么WAITING状态不是WAITABLE?


各位认为是出于什么考虑这样做的?
3384 次点击
所在节点    问与答
7 条回复
TempAccount
2013-06-18 12:45:58 +08:00
我的理解线程runnable是vm的事, 但是它running不running还得OS说了算
andybest
2013-06-18 12:49:00 +08:00
@TempAccount 谢谢,很有道理!

但是WAITING又怎么理解呢?既然VM无法决定是否running,同样也应无法决定是否waiting吧?
timonwong
2013-06-18 12:59:09 +08:00
是否真正 Running 是可以由 VM/OS 决定的,打个比方,如果在GC阶段,需要暂停所有线程。但这个过程是透明的,所以Runnable 比 Running 意义上更加合理。
Golevka
2013-06-18 13:03:56 +08:00
VM/OS会从若干runnable(ready)状态的线程中挑选一个运行, 所以处于ready状态的线程可能有许多, 而真正在运行线程的只有几个.

waiting的线程不在ready queue里面, 如果没有被唤醒就不会被调度到的.
andybest
2013-06-18 13:50:03 +08:00
@timonwong 明白了,非常感谢!


@Golevka 所以,由于ready queue的存在,一个状态为runnable的线程,实际上可能是并未在running对吗?
Droog
2013-06-18 14:40:06 +08:00
这个帖子比较有意义。
之前一直没深究这个。
Golevka
2013-06-18 16:40:11 +08:00
@andybest ready状态表示线程有被调度到的可能, 所以你可能会有好几十个ready的线程但是实际正在运行的只有一个.
嘛, 反正我写kernel时喜欢把ready的线程放进ready queue单独管理, java里面可能没有等价物但是活动线程集的概念应该也是类似的.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/72760

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX