隊列 LinkedBlockingQueue

1 api

    java.util.concurrent包下的新類。LinkedBlockingQueue就是其中之一,是一個阻塞的線程安全的隊列,底層採用鏈表實現。java

     

      LinkedBlockingQueue構造的時候若沒有指定大小,則默認大小爲Integer.MAX_VALUE,固然也能夠在構造函數的參數中指定大小。LinkedBlockingQueue不接受null。算法

 

    添加元素的方法有三個:add,put,offer,且這三個元素都是向隊列尾部添加元素的意思。api

    區別:安全

        add方法在添加元素的時候,若超出了度列的長度會直接拋出異常: 併發

 

 

      put方法,若向隊尾添加元素的時候發現隊列已經滿了會發生阻塞一直等待空間,以加入元素。 函數

    offer方法在添加元素時,若是發現隊列已滿沒法添加的話,會直接返回false。     性能

    

    從隊列中取出並移除頭元素的方法有:poll,remove,take。     spa

        poll: 若隊列爲空,返回null。線程

        remove:若隊列爲空,拋出NoSuchElementException異常。對象

        take:若隊列爲空,發生阻塞,等待有元素。

2基於LinkedBlockingQueue的生產者和消費者

3示例2

 併發庫中的BlockingQueue是一個比較好玩的類,顧名思義,就是阻塞隊列。該類主要提供了兩個方法put()和take(),前者將一個對象放到隊列中,若是隊列已經滿了,就等待直到有空閒節點;後者從head取一個對象,若是沒有對象,就等待直到有可取的對象。

 

 下面的例子比較簡單,一個讀線程,用於將要處理的文件對象添加到阻塞隊列中,

 另外四個寫線程用於取出文件對象,爲了模擬寫操做耗時長的特色,特讓線程睡眠一段隨機長度的時間。另外,該Demo也使用到了線程池和原子整型(AtomicInteger),AtomicInteger能夠在併發狀況下達到原子化更新,避免使用了synchronized,並且性能很是高。因爲阻塞隊列的put和take操做會阻塞,爲了使線程退出,特在隊列中添加了一個「標識」,算法中也叫「哨兵」,當發現這個哨兵後,寫線程就退出。

相關文章
相關標籤/搜索