Java PriorityBlockingQueue 阻塞行为

Java PriorityBlockingQueue blocking behavior

提问人:Kristóf Marosvári 提问时间:9/8/2023 更新时间:9/8/2023 访问量:16

问:

从我看到的文档中,该方法会阻止,直到元素可用。
还有其他情况可以阻止吗?
take()

我的意思是,有没有一种可能的情况,当队列为空时,但尽管如此,出于某种原因调用块。take()

如果有人知道这样的情况,请告诉我。

java 优先级队列 阻塞队列

评论


答:

1赞 Stephen C 9/8/2023 #1

还有其他情况可以阻止吗?

根据我对代码(Java 11 版本)的阅读,只有在调用时队列为空时才应该阻塞。take()

但这并不意味着当队列变为非空时,呼叫将立即取消阻止。事实上,如果两个或多个线程同时调用,可以想象一些线程会“挨饿”,因为到达的元素始终被传递到其他等待的线程。(使用实例来协调生产者和使用者,但这些实例不会创建为公平锁。take()take()PriorityBlockingQueueReentrantLock

另一种情况涉及错误或实现。当队列为非空或变为非空时,调用内部方法,该方法又使用 or 接口来筛选队列。如果您的 or 代码本身可以阻止,则会阻止当前调用和所有将来的调用。ComparableComparatortake()dequeueComparableComparatorComparableComparatortake()take()


话虽如此,您还需要考虑最明显的解释;也就是说,这是阻塞的,因为队列确实是空的。take()