Java隊列

在Java中隊列是基于Queue這個接口敛劝,不同的實現(xiàn)類有不同的性質丐黄,不是用數組就是用鏈表實現(xiàn)巍佑。

1茴迁、先看下這個接口提供的方法都有哪些,再具體看實現(xiàn)句狼。

1)boolean add(E e);如果容量不達上限笋熬,將元素插入隊列,并返回true腻菇。
2)boolean offer(E e);如果容量不達上限胳螟,將元素插入隊列,并返回true筹吐。當使用capacity-restricted queue時優(yōu)于add方法糖耸,這個capacity-restricted queue是什么呢?后續(xù)看下丘薛。
3)E remove();返回隊列頭元素嘉竟,并刪除。為空報NoSuchElementException異常洋侨。
4)E poll();返回隊列頭元素舍扰,并刪除。
5)E element();返回隊列頭元素希坚,但是不刪除边苹。為空報NoSuchElementException異常。
6)E peek();返回隊列頭元素裁僧,但是不刪除个束。

2、Queue有兩個接口BlockingQueue和Deque聊疲,Deque是兩端都能增刪的實現(xiàn)茬底,即有隊列的性質又有棧的性質,搞懂Queue获洲,Deque也差不多了阱表。
BlockingQueue的實現(xiàn)類類
1)ArrayBlockingQueue基于數組實現(xiàn)
offer方法

image.png

offer方法簡單易懂,用了ReentrantLock贡珊,說明是線程安全最爬,容量定長,超出返回false飞崖,用putIndex變量記錄每次添加的下標烂叔,超出長度重置為0。
但是這個notEmpty.signal()干啥用的固歪?有signal就有await蒜鸡,在這個類上搜下


take方法
這個take是BlockingQueue的方法,這個方法也是獲取頭部元素牢裳,只不過隊列為空會一直等待逢防,這個就是生產者、消費者模型蒲讯。
image.png

image.png

poll方法也是線程安全的忘朝,每次獲取得下標用takeIndex維護,初始值為0判帮,超出隊列長度重置局嘁。

總結下BlockingQueue定義的方法吧

1溉箕、void put(E e) throws InterruptedException;將元素插入隊列,如果隊列滿了就等待悦昵。這個應該是offer方法被占用實現(xiàn)了不等待的邏輯肴茄,但是干嘛取名put,來個offerWaitIfEmpty()多好。
2但指、boolean offer(E e, long timeout, TimeUnit unit) throws InterruptedException;將元素插入隊列寡痰,如果隊列滿了就等待傳入的時間。
3棋凳、E take() throws InterruptedException;
4拦坠、poll(long timeout, TimeUnit unit) throws InterruptedException;意義上是take的重載方法,加了等待的超時間剩岳。
5贞滨、int remainingCapacity();返回可用容量。
6卢肃、int drainTo(Collection<? super E> c);將當前隊列的值全部轉移到傳入c中疲迂。另一個重載方法是可以限定轉移的最大條數。

2)DelayQueue莫湘。

LinkedBlockingQueue這個就不講了尤蒿,鏈表實現(xiàn),源碼解讀沒什么難度幅垮。
DelayQueue是延時隊列腰池,添加元素的時候可以設置時間,獲取時候只能獲取到過期的元素忙芒。
jdk居然沒有給demo示弓,參考定時任務寫個demo吧

public class DelayQueueDemo {
    public static void main(String[] args) throws InterruptedException {
        DelayQueue<DelayDemo> delayeds = new DelayQueue<>();
        System.out.println("執(zhí)行開始時間:" + new Date());
        delayeds.offer(new DelayDemo(1, TimeUnit.SECONDS, "線程1"));
        delayeds.offer(new DelayDemo(2, TimeUnit.SECONDS, "線程2"));
        delayeds.offer(new DelayDemo(3, TimeUnit.SECONDS, "線程3"));
        DelayDemo take;
        while ((take = delayeds.take()) != null) {
            new Thread(take).start();
        }
    }
}

class DelayDemo implements Delayed, Runnable {

    private long time;
    private String threadName;

    public DelayDemo(long time, TimeUnit unit, String threadName) {
        this.time = triggerTime(time, unit);
        this.threadName = threadName;
    }

    @Override
    public long getDelay(TimeUnit unit) {
        return unit.convert(time - now(), NANOSECONDS);
    }

    @Override
    public int compareTo(Delayed o) {

        long diff = getDelay(NANOSECONDS) - o.getDelay(NANOSECONDS);
        return (diff < 0) ? -1 : (diff > 0) ? 1 : 0;
    }

    final long now() {
        return System.nanoTime();
    }

    @Override
    public void run() {
        System.out.println("當前線程為:" + threadName + "," + "當前時間為:" + new Date());
    }

    private long triggerTime(long delay, TimeUnit unit) {
        return triggerTime(unit.toNanos((delay < 0) ? 0 : delay));
    }

    long triggerTime(long delay) {
        return now() + delay;
    }

}
image.png

未完待續(xù)。呵萨。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末奏属,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子潮峦,更是在濱河造成了極大的恐慌囱皿,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件忱嘹,死亡現(xiàn)場離奇詭異嘱腥,居然都是意外死亡,警方通過查閱死者的電腦和手機拘悦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門齿兔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事分苇√硭撸” “怎么了?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵组砚,是天一觀的道長吻商。 經常有香客問我掏颊,道長糟红,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任乌叶,我火速辦了婚禮盆偿,結果婚禮上,老公的妹妹穿的比我還像新娘准浴。我一直安慰自己事扭,他們只是感情好,可當我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布乐横。 她就那樣靜靜地躺著求橄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪葡公。 梳的紋絲不亂的頭發(fā)上罐农,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天,我揣著相機與錄音催什,去河邊找鬼涵亏。 笑死,一個胖子當著我的面吹牛蒲凶,可吹牛的內容都是我干的气筋。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼旋圆,長吁一口氣:“原來是場噩夢啊……” “哼宠默!你這毒婦竟也來了?” 一聲冷哼從身側響起灵巧,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤搀矫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后孩等,有當地人在樹林里發(fā)現(xiàn)了一具尸體艾君,經...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年肄方,在試婚紗的時候發(fā)現(xiàn)自己被綠了冰垄。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖虹茶,靈堂內的尸體忽然破棺而出逝薪,到底是詐尸還是另有隱情,我是刑警寧澤蝴罪,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布董济,位于F島的核電站,受9級特大地震影響要门,放射性物質發(fā)生泄漏虏肾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一欢搜、第九天 我趴在偏房一處隱蔽的房頂上張望封豪。 院中可真熱鬧,春花似錦炒瘟、人聲如沸吹埠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缘琅。三九已至,卻和暖如春廓推,著一層夾襖步出監(jiān)牢的瞬間刷袍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工受啥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留做个,地道東北人。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓滚局,卻偏偏與公主長得像居暖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子藤肢,可洞房花燭夜當晚...
    茶點故事閱讀 44,647評論 2 354