Tim*_*imi 7 java multithreading state blocked
我通过以下帖子阅读了答案: 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 运行的线程。然后,每个互斥锁(又名锁)都有一个队列,用于保存等待进入该互斥锁的线程;每个条件变量都有一个队列,用于保存等待notify()有关该条件的线程,等等。
每当某个线程离开互斥体时,操作系统就会在队列中查找该互斥体。如果队列不为空,它将从该队列中选取一个线程并将其移至运行队列。每当某个线程调用 时o.notify(),操作系统就会从该条件变量的队列中选取一个线程并将其移动到运行队列,或者,如果程序调用notifyAll(),操作系统会将所有线程从该队列移动到运行队列。
因此,在操作系统级别,与其说是线程处于什么状态的问题,不如说是线程处于哪个队列的问题。
最后,在 JVM 级别,没有什么可说的,因为 JVM 让操作系统完成几乎所有的工作。Java 提供了两种状态:RUNNING 和 WAITING,只是为了方便程序员,了解它们之间的区别对您很有用。(提示:当您查看程序的转储并尝试找出每个线程当时在做什么时,这是最有趣的。)
| 归档时间: |
|
| 查看次数: |
1150 次 |
| 最近记录: |