阻塞隊列 LinkedBlockingQueue

1 api

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

     

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

 

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

    區別:

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

 

 

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

    offer方法在添加元素時,如果發現隊列已滿無法添加的話,會直接返回false。     

    

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

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

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

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

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

3示例2

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

 

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章