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



我已经通过以下帖子阅读了答案:等待和阻塞线程状态之间的差异但是,我仍然感到困惑。

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

这两个是否都有"线程上下文开关"?,哪个在多线程环境中更快?

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

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

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


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

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

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

通常,有一个运行队列保存准备运行的线程,但正在等待 CPU 运行。 然后,每个互斥锁(又名锁)都有一个队列,其中包含等待进入该互斥的线程,每个条件变量都有一个队列,其中包含等待对该条件进行notify()的线程,等等。

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

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


最后,在JVM

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

等待状态是线程有意调用wait()方法。这意味着它正在等待某个事件/操作完成。就像你去客户服务,队列是空的。您正在等待您的妻子带着保修卡到达。所以你在故意等待。

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

另一个例子是多线程,称为等待某个事件完成的方法。该事件完成后,将调用 notifyAll()。然后只有一个线程将获得 CPU 周期,其他线程仍将被阻塞

就像您去客户服务中心,没有客户代表在场一样。您被阻止了。

最新更新