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

时间:2016-03-11 10:55:15

标签: java multithreading state blocked

我已通过以下帖子阅读了答案:Difference between WAIT and BLOCKED thread states 但是,我仍然感到困惑。

我想知道JVM级别的差异以及CPU级别的差异。

这两个都是否具有“线程上下文切换”? ,在多线程环境中哪个更快?

2 个答案:

答案 0 :(得分:1)

假设您询问状态Thread.State.BLOCKEDThread.State.WAITING之间的区别(即t.getState()返回的)?

  

我想知道jvm级别的差异以及CPU上的差异

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

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

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

操作系统中的每个线程对象都可以在以下几个容器中找到:有一个容器包含所有正在运行的线程的集合,还有其他容器(大多数是队列)来保存未运行的线程。 / p>

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

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

因此,在操作系统级别,问题不在于状态是什么线程,因为这是队列的问题是线程。

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

答案 1 :(得分:0)

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

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

另一个例子是多线程调用wait方法来完成某些事件。该事件完成后,将调用notifyAll()。然后只有一个线程将获得CPU周期,其他线程仍将被阻止

就像您去客户服务一样,没有客户代表在场。你被封锁了。