我是靠谱客的博主 无心枕头,最近开发中收集的这篇文章主要介绍java 线程 阻塞 等待_java – 线程状态被阻塞和等待之间的区别,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

假设您询问Thread.State.BLOCKED和Thread.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运行.然后每个互斥锁(a.k.a.,lock)都有一个队列,它保存等待进入该互斥锁的线程,每个条件变量的队列,其中包含等待通知的线程()d关于该条件等.

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

因此,在操作系统级别,问题不在于线程处于什么状态,因为它是哪个队列是线程的问题.

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

最后

以上就是无心枕头为你收集整理的java 线程 阻塞 等待_java – 线程状态被阻塞和等待之间的区别的全部内容,希望文章能够帮你解决java 线程 阻塞 等待_java – 线程状态被阻塞和等待之间的区别所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部