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

difference between Thread state blocked and waiting

我已通过以下帖子阅读答案:Difference between WAIT and BLOCKED thread states 但是,我还是很疑惑。

我想知道JVM级别的区别和CPU级别的区别

是否这两个都有"Thread Context switch"? , 在多线程环境中哪个更快?

等待状态是线程有意调用 wait() 方法时。这意味着它等待一些 event/action 完成。就像你去客户服务中心排队是空的。你正在等待你的妻子带着保修卡到来。所以你是故意等的。

但在 BLOCKED 状态下,Thread 已准​​备好 运行 但由于某些原因其他事件阻止了它。就像一个线程即将进入同步块,但当前 运行 在同一个对象的同步块内有另一个线程。

另一个例子是多线程调用等待方法等待某个事件完成。一旦该事件完成,将调用 notifyAll()。那么只有一个线程会获得 CPU 循环,其他线程仍将被阻塞

这就像您去客户服务中心,但没有客户代表在场。你被屏蔽了。

假设您询问状态 Thread.State.BLOCKEDThread.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 不是 运行ning 您程序的代码,那么它是 运行ning 属于其他进程或操作系统的代码;否则它处于与 Java 或 JVM 无关的空闲状态。


那么,你就跳过了一层——操作系统。所有实用的 JVM 都通过使用操作系统提供的线程原语来实现 Java 个线程。

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

OS 中的每个线程对象都可以在几个容器之一中找到:有一个容器包含所有 运行ning 线程的集合,还有其他容器(主要是队列) 持有非 运行ning.

的线程

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

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

因此,在 OS 级别,与其说线程处于什么 state 的问题,不如说 [=35] =]队列是线程在.


最后,在 JVM 级别,没有太多要说的了,因为 JVM 让 OS 完成几乎所有的工作。 Java 提供了两种状态,运行 和 WAITING 只是为了方便您,程序员,以防您了解其中的区别。 (提示:当您查看程序的转储并试图弄清楚当时每个线程在做什么时,这最有趣。)