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

标签 java multithreading thread-state blocked-threads

<分区>

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

我想知道在 JVM 级别上有什么区别,在 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 没有运行您的程序代码,那么它要么正在运行属于其他进程的代码,要么属于操作系统;否则它处于与 Java 或 JVM 无关的空闲状态。


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

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

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

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

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

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


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

关于java - 线程状态阻塞和等待之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35938395/

相关文章:

java - 尝试从 "main-menu"类调用方法,但它被卡住了,但是当从方法类调用时,它工作得很好

c++ - 具有pthread和锁且无提升的单读者多作者

PHP/MySQL 并发 - 写依赖于读 - 临界区

c# - 异步等待 : is the main thread suspended?

java - 当线程改变状态时会发生上下文切换吗?

java - 使用反射搜索和调用方法的开销

java - PerformClick()方法不起作用,出现错误

java - 在Thread内创建一个service或者在Service内创建一个service

java - 应用程序类是在 UI 线程上运行还是?

java - 如何将线程从阻塞状态恢复到可运行状态?