提问者:小点点

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


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

据我所知

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

等待队列防止线程竞争相同的锁。

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


共1个答案

匿名用户

这个问题只有在假设它实际上意味着“什么情况下会导致线程从等待状态更改为阻塞状态时才有意义?”

可能有一个特定的调度程序实现在专审队列中维护这些线程,在这些状态更改时必须将线程从一个队列移动到另一个队列,并影响最初提出问题的人的思维方式,但是这样的问题不应该加载假设的实现细节。作为附带说明,虽然可运行线程的队列是有意义的,但我无法想象将阻塞等待线程放入(全局)队列的真正理由。

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

>

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

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

    作为一种特殊情况,Java认为线程处于timed_waiting状态,如果它们在超时时调用上述方法或执行Thread.睡眠。这种状态与等待状态的不同之处在于,该状态也可能由于经过的时间而结束。

    当线程在对象上调用等待时,它必须拥有对象的监视器,即在同步的方法或代码块中。监视器在此调用时被释放,并在返回时重新获取。当无法立即重新获取时,线程将从等待timed_waiting状态变为阻塞状态。