在什么条件下会发生这种情况?
据我所知
阻塞队列是产生对象的线程和消费对象之间的缓冲区。
等待队列防止线程竞争相同的锁。
所以线程获得了锁,但无法传递给消费者,因为它现在很忙?
这个问题只有在假设它实际上意味着“什么情况下会导致线程从等待
状态更改为阻塞
状态时才有意义?”
可能有一个特定的调度程序实现在专审队列中维护这些线程,在这些状态更改时必须将线程从一个队列移动到另一个队列,并影响最初提出问题的人的思维方式,但是这样的问题不应该加载假设的实现细节。作为附带说明,虽然可运行
线程的队列是有意义的,但我无法想象将阻塞
或等待
线程放入(全局)队列的真正理由。
如果这是问题的初衷,则不应将其与实现队列并具有类似名称的Java类混淆。
>
如果一个线程在另一个线程拥有对象监视器时尝试输入同步
方法或代码片段,则该线程处于阻塞
状态。如果所有者释放监视器并且被阻塞的线程成功获取监视器,则线程将从那里转向runnable
状态
一个线程处于等待
状态,如果执行一个只能继续的显式操作,如果另一个线程执行关联的操作,即如果线程对一个对象调用等待
,它只能在另一个线程对同一个对象调用通知
时继续。如果线程调用LockSupport. park()
,另一个线程必须以该线程作为参数调用LockSupport.unpark()
。当它在另一个线程上调用join
时,该线程必须结束其执行以结束等待。等待
状态也可能由于中断或spuriuos唤醒而结束。
作为一种特殊情况,Java认为线程处于timed_waiting
状态,如果它们在超时时调用上述方法或执行Thread.睡眠
。这种状态与等待
状态的不同之处在于,该状态也可能由于经过的时间而结束。
当线程在对象上调用等待
时,它必须拥有对象的监视器,即在同步的
方法或代码块中。监视器在此调用时被释放,并在返回时重新获取。当无法立即重新获取时,线程将从等待
或timed_waiting
状态变为阻塞
状态。