哪些情况会导致线程从等待队列转移到阻塞队列?

What circmustances can cause a thread to be transferred from the wait queue to the blocked queue?

在什么情况下会发生这种情况?

据我所知

阻塞队列是线程生产对象和消费对象之间的缓冲区。

等待队列防止线程竞争同一个锁。

所以线程获得了锁,但由于它现在很忙而无法传递给消费者?

这个问题只有在假设它实际上意味着“什么情况下会导致线程从wait 状态改变才有意义blocked状态?”

可能有一个特定的调度程序实现在专用队列中维护这些线程,在这些状态发生变化时必须将线程从一个队列移动到另一个队列并影响最初提出问题的人的思维定势,但这样的问题应该'加载假设的实现细节。作为旁注,虽然 runnable 线程的队列是有意义的,但我无法想象将 blockedwaiting 线程放入(全局)队列的真正原因。

如果这是问题的初衷,则不应将其与 Java 类 实现队列并具有相似的发音混淆。

  • 如果线程试图进入 synchronized 方法或代码片段,而另一个线程拥有对象监视器,则该线程处于 blocked 状态。从那里,如果所有者释放监视器并且被阻塞的线程成功获取监视器,线程将转向 runnable 状态

  • 一个线程处于 waiting 状态如果执行一个只能继续的显式操作,如果另一个线程执行关联的操作,即如果线程调用 wait一个对象,只有当另一个线程在同一个对象上调用 notify 时,它才能继续。如果线程调用 LockSupport.park(),则另一个线程必须以该线程作为参数调用 LockSupport.unpark()。当它在另一个线程上调用 join 时,该线程必须结束其执行以结束等待。 waiting 状态也可能由于 中断 spuriuos 唤醒.

  • 而结束
  • 作为一种特殊情况,Java 认为线程处于 timed_waiting 状态,如果它们调用上述方法超时或执行 Thread.sleep.此状态与 waiting 状态的唯一区别在于,该状态也可能因经过时间而结束。

当线程在对象上调用 wait 时,它必须拥有对象的监视器,即在 synchronized 方法或代码块中。监视器在调用时释放,返回时重新获取。当不能立即重新获取时,线程会从waitingtimed_waiting状态进入blocked状态。