delayqueue是乙個無界阻塞佇列,只有在延遲期滿時才能從中提取元素。該佇列的頭部是延遲期滿後儲存時間最長的delayed 元素。底層也是通過陣列實現,所以讀寫操作使用的是同一把鎖,其插入的元素必須實現delayed介面。
public
delayqueue() {}
public
delayqueue(collection extends e> c)
public
inte***ce
delayed
extends
comparable
delayed介面繼承了comparable介面,所以當我們插入的元素實現delayed介面時,須實現兩個方法getdelay(timeunit unit)和compareto(delayed o),這兩個方法將在下面原始碼中介紹。
其中q是priorityqueue q = new priorityqueue(); 可見其實現是通過priorityqueue實現。
add和put都是呼叫offer方法,他們三者無任何區別,新增元素都是立刻新增的,無延遲。
那siftup(i, e)
裡面是什麼呢?
看到這裡是不是感覺熟悉,是的這裡類似priorityblockingqueue,因為comparator為null, 會使用插入元素實現了comparatable介面的方法進行比較,按照順序插入。(解釋了compareto(delayed o)方法)
可見,和其它阻塞佇列的peek方法一樣,也是立刻取值,並不延遲。
從first.getdelay(nanoseconds) > 0
可以看出,當取的元素是null或者未到期時,這時就會返回null.
getdelay方法就是介面delayed介面的方法,也就是插入元素的方法(插入元素實現delayed介面)。(解釋了getdelay(timeunit unit)方法)。
take方法會阻塞,直到待取元素已經到期了。
public
class
delayqueueexample
@test
public
void
test() throws interruptedexception
static class delayelementimplements delayed
static
delayelementof(t e, timeunit unit,long dealy)
static
delayelementof(t e,long dealy)
@override
public
long
getdelay(timeunit unit)
@override
public
intcompareto(delayed o) else
if (this.dealy < that.getdealy()) else
}public e gete()
public
long
getdealy()
@override
public string tostring() ';}}
}
STL學習系列五 Queue容器
queue簡介 1.queue物件的預設構造 queue採用模板類實現,queue物件的預設構造形式 queuequet 如 queue queint 乙個存放int的queue容器。queue quefloat 乙個存放float的queue容器。尖括號內還可以設定指標型別或自定義型別。2.que...
STL系列之三 queue 單向佇列
queue單向佇列與棧有點類似,乙個是在同一端訪問資料,另乙個是在一端存入資料,另一端取出資料。單向佇列中的資料是先進先出 first in first out,fifo 在stl中,單向佇列也是以別的容器作為底部結構,再將介面改變,使之符合單向佇列的特性就可以了。因此實現也是非常方便的。下面就給出...
STL系列之三 queue 單向佇列
queue單向佇列與棧有點類似,乙個是在同一端訪問資料,另乙個是在一端存入資料,另一端取出資料。單向佇列中的資料是先進先出 first in first out,fifo 在stl中,單向佇列也是以別的容器作為底部結構,再將介面改變,使之符合單向佇列的特性就可以了。因此實現也是非常方便的。下面就給出...