隊列 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操作會阻塞,為了使線程退出,特在隊列中添加了一個“標識”,算法中也叫“哨兵”,當發現這個哨兵后,寫線程就退出。






















免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM