提问人:Kristóf Marosvári 提问时间:9/8/2023 更新时间:9/8/2023 访问量:16
Java PriorityBlockingQueue 阻塞行为
Java PriorityBlockingQueue blocking behavior
问:
从我看到的文档中,该方法会阻止,直到元素可用。
还有其他情况可以阻止吗?take()
我的意思是,有没有一种可能的情况,当队列不为空时,但尽管如此,出于某种原因调用块。take()
如果有人知道这样的情况,请告诉我。
答:
1赞
Stephen C
9/8/2023
#1
还有其他情况可以阻止吗?
根据我对代码(Java 11 版本)的阅读,只有在调用时队列为空时才应该阻塞。take()
但这并不意味着当队列变为非空时,呼叫将立即取消阻止。事实上,如果两个或多个线程同时调用,可以想象一些线程会“挨饿”,因为到达的元素始终被传递到其他等待的线程。(使用实例来协调生产者和使用者,但这些实例不会创建为公平锁。take()
take()
PriorityBlockingQueue
ReentrantLock
另一种情况涉及错误或实现。当队列为非空或变为非空时,调用内部方法,该方法又使用 or 接口来筛选队列。如果您的 or 代码本身可以阻止,则会阻止当前调用和所有将来的调用。Comparable
Comparator
take()
dequeue
Comparable
Comparator
Comparable
Comparator
take()
take()
话虽如此,您还需要考虑最明显的解释;也就是说,这是阻塞的,因为队列确实是空的。take()
评论