java – 线程状态被阻塞和等待之间的区别

参见英文答案 > Difference between WAIT and BLOCKED thread states                                    6个
我通过以下帖子阅读了答案:Difference between WAIT and BLOCKED thread states
但是,我仍然感到困惑.

我想知道JVM级别有什么不同,CPU级别有什么不同.

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

最佳答案
假设您询问Thread.State.BLOCKED和Thread.State.WAITING状态之间的区别(即,由t.getState()返回)?

I want to know what is the difference on jvm level and what difference on the CPU

从下到上,硬件级别没有区别,因为这些状态不是硬件概念. WAITING线程和BLOCKED线程根本不使用CPU资源.如果CPU没有运行程序的代码,那么它要么运行属于某个其他进程的代码,要么运行到操作系统;否则它处于与Java或JVM无关的空闲状态.

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

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

操作系统中的每个线程对象都可以在以下几个容器中找到:有一个容器保存所有正在运行的线程的集合,还有其他容器(大多数是队列)来保存未运行的线程.

通常,有一个运行队列包含准备运行的线程,但它们正在等待CPU运行.然后每个互斥锁(a.k.a.,lock)都有一个队列,它保存等待进入该互斥锁的线程,每个条件变量的队列,其中包含等待通知的线程()d关于该条件等.

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

因此,在操作系统级别,问题不在于线程处于什么状态,因为它是哪个队列是线程的问题.

最后,在JVM级别上,没有什么可说的了,因为JVM让操作系统完成了所有的工作. Java提供了两种状态,RUNNING和WAITING只是为了方便程序员,以防您了解其中的区别. (提示:当你正在查看程序的转储,并试图弄清楚每个线程当时在做什么时,这非常有趣.)

转载注明原文:java – 线程状态被阻塞和等待之间的区别 - 代码日志