這裏能夠看到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
對這個類不是很熟悉,咱們來寫個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