非阻塞隊列 和 阻塞隊列

        阻塞隊列與普通隊列的區別在於,當隊列是空的時,從隊列中獲取元素的操做將會被阻塞,或者當隊列是滿時,往隊列裏添加元素的操做會被阻塞。試圖從空的阻塞隊列中獲取元素的線程將會被阻塞,直到其餘的線程往空的隊列插入新的元素。一樣,試圖往已滿的阻塞隊列中添加新元素的線程一樣也會被阻塞,直到其餘的線程使隊列從新變得空閒起來,如從隊列中移除一個或者多個元素,或者徹底清空隊列.spa

                使用非阻塞隊列的時候有一個很大問題就是  : 它不會對當前線程產生阻塞,那麼在面對相似消費者-生產者的模型時,就必須額外地實現同步策略以及線程間喚醒策略,這個實現起來就很是麻煩。可是有了阻塞隊列就不同了,它會對當前線程產生阻塞,好比一個線程從一個空的阻塞隊列中取元素,此時線程會被阻塞直到阻塞隊列中有了元素。當隊列中有元素後,被阻塞的線程會自動被喚醒(不須要咱們編寫代碼去喚醒)。這樣提供了極大的方便性線程

    

1.非阻塞隊列中的幾個主要方法:orm

  •   add(E e):將元素e插入到隊列末尾,若是插入成功,則返回true;若是插入失敗(即隊列已滿),則會拋出異常;隊列

  •   remove():移除隊首元素,若移除成功,則返回true;若是移除失敗(隊列爲空),則會拋出異常;rem

  •   offer(E e):將元素e插入到隊列末尾,若是插入成功,則返回true;若是插入失敗(即隊列已滿),則返回false;同步

  •   poll():移除並獲取隊首元素,若成功,則返回隊首元素;不然返回null;it

  •   peek():獲取隊首元素,若成功,則返回隊首元素;不然返回null方法

 

  對於非阻塞隊列,通常狀況下建議使用offer、poll和peek三個方法,不建議使用add和remove方法。由於使用offer、poll和peek三個方法能夠經過返回值判斷操做成功與否,而使用add和remove方法卻不能達到這樣的效果。注意,非阻塞隊列中的方法都沒有進行同步措施。im

2.阻塞隊列中的幾個主要方法:異常

  阻塞隊列包括了非阻塞隊列中的大部分方法,上面列舉的5個方法在阻塞隊列中都存在,可是要注意這5個方法在阻塞隊列中都進行了同步措施。除此以外,阻塞隊列提供了另外4個很是有用的方法:

  1.   put(E e)

  2.   take()

  3.   offer(E e,long timeout, TimeUnit unit)

  4.   poll(long timeout, TimeUnit unit)

  

  •   put方法用來向隊尾存入元素,若是隊列滿,則等待;

  •   take方法用來從隊首取元素,若是隊列爲空,則等待;

  •   offer方法用來向隊尾存入元素,若是隊列滿,則等待必定的時間,當時間期限達到時,若是尚未插入成功,則返回false;不然返回true;

  •   poll方法用來從隊首取元素,若是隊列空,則等待必定的時間,當時間期限達到時,若是取到,則返回null;不然返回取得的元素;

相關文章
相關標籤/搜索