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

时间:2017-01-24 18:34:34

标签: java concurrency scheduling

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

据我所知

阻塞队列是生成对象和使用对象的线程之间的缓冲区。

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

所以线程获得锁定,但是因为它现在很忙而无法传递给消费者?

1 个答案:

答案 0 :(得分:1)

这个问题只有在假设它实际上意味着“什么情况可以导致线程从<{1}} 状态 <{>>更改到{{ 1}} ?“

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

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

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

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

  • 作为一种特殊情况,Java认为线程处于join状态,如果它们通过超时或执行waiting调用上述方法。此状态仅与timed_waiting状态不同,因为状态可能也会因经过的时间而结束。

当一个线程在一个对象上调用Thread.sleep时,它必须拥有该对象的监视器,即在waiting方法或代码块内。监视器在此调用时释放,并在返回时重新获取。如果无法立即重新获取,则该主题将从waitsynchronized状态转到waiting状态。