DelayQueue類是一個無邊界的阻塞隊列類,線程安全類,它內部維護的是一個PriorityQueue類對象,PriorityQueue是一個無邊界的隊列類,但不是線程安全,即不會使用在
阻塞隊列使用的場景中。DelayQueue類的核心技術就是使用PriorityQueue類對象和同步處理工具ReentrantLock類和ConditionObject類,這兩者的結合使得DelayQueue阻塞類
既有線程安全能力也有隊列功能。
ReentrantLock類對象保證了隊列資源的線程安全,但是在我們之前學過的阻塞隊裏類中都會有兩個ConditionObject類對象分別是隊列爲空和滿隊列條件。但是在DelayQueue
類中只有空隊列條件,這是因爲DelayQueue是一個無邊界的線程安全類。所以不需要滿隊列條件。
關於ReentrantLock類的原理和源碼分析請看博主之前的博客文章,這裏不再贅述。
想要了解DelayQueue類的實際使用的業務場景請看下面兩篇較好的博客文章
1. 考試場景: 學生,老師等 http://ideasforjava.iteye.com/blog/657384
2. 第一種場景的補償及具有過期時間的緩存 http://www.cnblogs.com/sunzhenchao/p/3515085.html
這兩個例子對於DelayQueue類的使用十分清楚。
DelayQueue類的屬性源碼展示:
public class DelayQueue<E extends Delayed> extends AbstractQueue<E>
implements BlockingQueue<E> {
private transient final ReentrantLock lock = new ReentrantLock();//資源多線程同步鎖
private final PriorityQueue<E> q = new PriorityQueue<E>();//無界隊列對象
private Thread leader = null;
private final Condition available = lock.newCondition();//空隊列條件