我已经通过以下帖子阅读了答案: WAIT 和 BLOCKED 线程状态之间的区别 但是,我仍然感到困惑。
我想知道 JVM 级别有什么区别,CPU 级别有什么区别。
这两者是否都有“线程上下文切换”?,在多线程环境中哪个更快?
我已经通过以下帖子阅读了答案: WAIT 和 BLOCKED 线程状态之间的区别 但是,我仍然感到困惑。
我想知道 JVM 级别有什么区别,CPU 级别有什么区别。
这两者是否都有“线程上下文切换”?,在多线程环境中哪个更快?
假设您询问状态Thread.State.BLOCKED
和Thread.State.WAITING
(即返回的t.getState()
)之间的区别?
我想知道jvm级别有什么区别,CPU有什么区别
自下而上工作,在硬件层面没有区别,因为这些状态不是硬件概念。WAITING 线程和 BLOCKED 线程根本不使用 CPU 资源。如果 CPU 没有运行您的程序代码,那么它要么正在运行属于某个其他进程的代码,要么属于操作系统;否则它处于与 Java 或 JVM 无关的空闲状态。
然后,你跳过了一层——操作系统。所有实际的 JVM 都使用操作系统提供的线程原语来实现 Java 线程。
在操作系统中,每个线程都由一个对象表示,该对象包含操作系统需要知道的有关线程的所有信息。当一个线程在某个 CPU 上运行时,该对象会告诉操作系统哪个 CPU 以及它运行了多长时间等。当一个线程未运行时,该对象包含 CPU 状态的快照,必须恢复该快照才能使线程再次运行。
操作系统中的每个线程对象都可以在多个容器之一中找到:有一个容器保存所有正在运行的线程集,还有其他容器(主要是队列)保存未运行的线程。
通常有一个运行队列保存准备运行但正在等待 CPU 运行的线程。然后,每个互斥锁(又名lock)都有一个队列,它持有等待进入该互斥锁的线程,每个条件变量都有一个队列,该队列持有等待notify()
关于该条件的线程,等等。
每当某个线程离开互斥体时,操作系统都会查看该互斥体的队列。如果队列不为空,它将从该队列中选择一个线程并将其移动到运行队列。每当某个线程调用o.notify()
时,操作系统会从该条件变量的队列中挑选一个线程并将其移至运行队列,或者,如果程序调用notifyAll()
,则操作系统会将所有线程从该队列移至运行队列。
因此,在操作系统级别,与其说是线程处于什么状态的问题,不如说是线程处于哪个队列的问题。
最后,在 JVM 级别,没有什么好说的了,因为 JVM 让操作系统完成了几乎所有的工作。Java 提供两种状态,RUNNING 和 WAITING 只是为了方便你,程序员,以防你知道它们的区别。(提示:当您查看程序的转储并试图弄清楚每个线程当时在做什么时,这最有趣。)
等待状态是线程故意调用 wait() 方法。这意味着它等待某些事件/动作完成。就像您去客户服务中心并且队列是空的。您正在等待您的妻子带着保修卡到达。所以你故意等待。
但是在 BLOCKED 状态下,线程已准备好运行,但其他事件由于某种原因阻止了它。就像一个线程即将进入一个同步块,但是在同一个对象上的一个同步块内当前正在运行另一个线程。
另一个例子是多个线程调用等待方法等待某个事件完成。一旦该事件完成,就会调用 notifyAll()。然后只有一个线程将获得 CPU 周期,其他线程仍将被阻塞
就像您去客户服务中心并且没有客户代表在场。你被封锁了。