线程状态被阻止和等待之间的区别

蒂米

我已经通过以下发布阅读了答案:WAIT和BLOCKED线程状态之间的区别但是,我仍然感到困惑。

我想知道JVM级别有什么区别,CPU级别有什么区别。

它们是否都具有“线程上下文切换”?,在多线程环境中哪个更快?

所罗门慢

假设您要询问状态Thread.State.BLOCKED之间的差异Thread.State.WAITING(即,由返回t.getState())?

我想知道jvm级别有什么区别以及CPU上有什么区别

自下而上地工作,在硬件级别上没有区别,因为那些状态不是硬件概念。等待线程和阻塞线程根本不使用CPU资源。如果CPU没有运行您程序的代码,则它要么运行的代码属于某个其他进程,要么属于操作系统。否则它处于空闲状态,与Java或JVM无关。


然后,您跳过了一层操作系统。所有实用的JVM通过使用操作系统提供的线程原语来实现Java线程。

在操作系统中,每个线程都由一个对象表示,该对象包含OS需要了解的有关该线程的所有信息。当某个线程在某个CPU上运行时,该对象会告诉OS哪个CPU以及它运行了多长时间,等等。当一个线程不在运行时,该对象包含必须恢复的CPU状态的快照才能使该CPU运行。线程再次运行。

可以在以下几个容器之一中找到OS中的每个线程对象:一个容器保存所有正在运行的线程集,还有其他容器(主要是队列)保存未运行的线程。

通常,有一个运行队列保存准备运行但正在等待CPU运行的线程。然后,每个互斥量(也称为lock都有一个队列,等待进入该互斥量的线程,每个条件变量都有一个队列,该线程等待notify()有关该条件的d等。

每当某个线程离开互斥锁时,操作系统就会查看该互斥锁的队列。如果队列不为空,则从该队列中选择一个线程并将其移至运行队列。每当有一些线程调用时o.notify(),操作系统就会从该条件变量的队列中选择一个线程并将其移至运行队列,或者,如果程序调用了notifyAll(),操作系统会将所有线程从该队列移至运行队列。

因此,在操作系统级别,与其说线程处于哪个状态,不如说是线程处于哪个队列的问题


最后,在JVM级别上,没有什么可说的了,因为JVM使OS可以完成几乎所有的工作。Java提供了RUNNING和WAITING这两种状态,只是为了给程序员带来方便,以防您知道它们之间的区别。(提示:当您查看程序的转储并试图弄清楚每个线程当时在做什么时,这最有意思。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章