阻塞queue系列之DelayQueue

2021-08-13 20:55:43 字數 1887 閱讀 9720

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中,單向佇列也是以別的容器作為底部結構,再將介面改變,使之符合單向佇列的特性就可以了。因此實現也是非常方便的。下面就給出...