BlockingQueue 的介紹和使用

SunlightDen發表於2021-01-02

作用

BlockingQueue為一個阻塞佇列,這裡的阻塞有兩個含義

  • 從佇列中獲取元素時,如果佇列為空,獲取元素的執行緒會等待至佇列中有元素再返回。
  • 往佇列新增元素時,如果佇列已滿,新增元素的佇列會等待至佇列有位置的時候再新增新的元素

特點

  1. BlockingQueue中的元素不能為空
  2. 為執行緒安全的,但是涉及到批量操作時就不一定是原子操作。比如addAll,removeAll這種。
  3. 可以用來實現生產者-消費者佇列的,並且支援多消費者和多生產者。當然也可以用來當作普通的Collection來使用,因為他實現了java.util.Collection介面。
  4. 有界佇列,並不是真正的無界佇列,他的最大值為Integer.MAX_VALUE.

使用

在BlockingQueue中有多種插入刪除和獲取元素的方法。每種方法都會有不同的作用,下面會介紹BlockingQueue的幾個核心方法

插入元素

  • boolean add(E e):如果佇列中有空間,立即插入一個元素到佇列中,並返回true。如果佇列中沒有空間了,就會丟擲IllegaStateException異常。對於遊街佇列,更常用的是使用offer方法。
  • boolean offer(E e):如果佇列中有空間,立即插入一個元素到佇列中,並返回true,如果沒有空間則返回false。
  • void put(E e):插入一個元素到佇列中,如果該佇列當前已滿,則該方法會一隻阻塞,直到有位置可以新增後才會繼續執行。
  • boolean offer(E e,long timeout,TimeUnit unit):插入一個元素到佇列中,如果佇列已滿則等待timeout時長,插入成功並返回true,超時則返回false.

獲取元素

  • E take():獲取列頭部的第一個元素,並在佇列中移除,如果佇列中沒有元素,則會一直等待直到有元素來返回。
  • E poll(long timeout,TimeUnit unit): 取得佇列頭部的第一個元素,並講它從佇列中移除,如果佇列中沒有元素會等待timeout時常。

移除元素

  • boolean remove(Object o):從佇列中移除指定的元素(當佇列中存在這個元素時),判斷方式equals方法。如果移除的元素和佇列中元素的型別不一樣,就會丟擲ClassCastException異常,如果佇列中有多個元素,就會移除掉最先超乳到佇列中的那一個。

檢索一個元素

  • E remove():檢索出佇列中頭部第一個元素,但是不會刪除,如果佇列為空則丟擲NoSuchElemenException異常
  • E peel(): 也是用來檢索佇列中的第一個元素,也不會刪除,如果佇列為空的時候,不會丟擲異常而是返回null。

相關文章