看看DelayQueue源碼

這裏能夠看到DelayQueue類的層次結構。這是一個Delayed元素的無界阻塞隊列,其中只有在延遲過時時才能獲取元素。隊列的頭部的元素是根據繼承的接口方法compareTo比較最小的。當元素的getDelay(TimeUnit.NANOSECONDS)方法返回小於或等於零的值時,會發生到期。即便使用take或poll沒法刪除未到期的元素,例如,size方法返回已過時和未過時元素的計數。html

此隊列不容許null元素。java

該類及其迭代器實現了Collection和Iterator接口的全部可選方法。方法iterator()中提供的迭代器不保證以任何特定順序遍歷DelayQueue的元素。api

Delayed的結構,繼承Comparable接口,並增長了 long getDelay(TimeUnit unit)方法,這個方法返回到激活日期的剩餘時間,時間單位由單位參數指定。oracle

該接口強制執行下列兩個方法。3d

  • CompareTo(Delayed o):Delayed接口繼承了Comparable接口,所以有了這個方法。
  • getDelay(TimeUnit unit):這個方法返回到激活日期的剩餘時間,時間單位由單位參數指定。

對這個類不是很熟悉,咱們來寫個demo,寫個Message實現Delayed接口htm

而後寫一個DelayQueue來實現想要的功能blog

輸出:繼承

該類有兩個構造方法接口

帶參數的那個實際上執行的是offer方法,具體的實現仍是PriorityQueue的隊列

這裏獲取值的時候用了take方法,檢索並刪除此隊列的頭部,必要時等待,直到此隊列上有一個具備過時延遲的元素。這裏用了ReentrantLock和Condition控制。

這裏用的poll的方法也是頗有趣的,檢索並刪除此隊列的頭部,若是此隊列沒有具備過時延遲的元素,則返回null。

參考:https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/DelayQueue.html

相關文章
相關標籤/搜索