在本教程中,我們將學(xué)習(xí)Java BlockingQueue接口及其方法。
Java Collections框架的BlockingQueue接口擴展了Queue接口。它允許任何操作等待,直到成功執(zhí)行。
例如,如果我們要從空隊列中刪除元素,則阻塞隊列允許刪除操作等待,直到隊列中包含一些要刪除的元素。
由于BlockingQueue是一個接口,因此我們無法提供它的直接實現(xiàn)。
為了使用BlockingQueue的功能,我們需要使用實現(xiàn)它的類。
我們必須導(dǎo)入java.util.concurrent.BlockingQueue包才能使用BlockingQueue。
//BlockingQueue的Array實現(xiàn) BlockingQueue<String> animal1 = new ArraryBlockingQueue<>(); //BlockingQueue的LinkedList實現(xiàn) BlockingQueue<String> animal2 = new LinkedBlockingQueue<>();
在這里,我們分別創(chuàng)建了類ArrayBlockingQueue和LinkedBlockingQueue的對象animal1和animal2。 這些對象可以使用BlockingQueue接口的功能。
根據(jù)隊列是滿還是空,阻塞隊列的方法可以分為3類:
add() - 將元素插入到隊列末尾的阻塞隊列中。 如果隊列已滿,則拋出異常。
element() - 返回阻塞隊列的頭部。如果隊列為空,則拋出異常。
remove() -從阻塞隊列中刪除一個元素。如果隊列為空,則拋出異常。
offer() - 將指定的元素插入到隊列末尾的阻塞隊列中。 如果隊列已滿,則返回false。
peek() - 返回阻塞隊列的頭部。 如果隊列為空,則返回null。
poll() - 從阻塞隊列中刪除一個元素。如果隊列為空,則返回null。
offer()和poll()更多內(nèi)容
offer()和poll()方法可以與超時一起使用。 也就是說,我們可以傳遞時間單位作為參數(shù)。 例如,
offer(value, 100, milliseconds)
這里,
value 是要插入隊列的元素
并且我們將超時設(shè)置為100毫秒
這意味著offer()方法將嘗試向阻塞隊列插入一個元素,時間為100毫秒。如果100毫秒內(nèi)無法插入元素,該方法將返回false。
注:除了毫秒以外,我們還可以在offer()和poll()方法中使用以下時間單位:days,hours,minutes,seconds,microseconds和nanoseconds。
BlockingQueue還提供了一些方法來阻塞操作和等待,如果隊列滿或空。
put() - 將元素插入到阻塞隊列。 如果隊列已滿,它將等待直到隊列有空間插入元素。
take() - 從阻塞隊列中移除并返回一個元素。如果隊列為空,它將等待,直到隊列中有要刪除的元素。
假設(shè),我們想要向隊列中插入元素。如果隊列已滿,那么put()方法將等待,直到隊列有空間插入元素。
同樣,如果我們想從隊列中刪除元素。如果隊列為空,那么take()方法將等待,直到隊列包含要刪除的元素。
import java.util.concurrent.BlockingQueue; import java.util.concurrent.ArrayBlockingQueue; class Main { public static void main(String[] args) { //使用ArrayBlockingQueue創(chuàng)建一個阻塞隊列 BlockingQueue<Integer> numbers = new ArrayBlockingQueue<>(5); try { //插入元素到阻塞隊列 numbers.put(2); numbers.put(1); numbers.put(3); System.out.println("BLockingQueue: " + numbers); //從阻塞隊列中移除元素 int removedNumber = numbers.take(); System.out.println("Removed Number: " + removedNumber); } catch(Exception e) { e.getStackTrace(); } } }
輸出結(jié)果
BlockingQueue: [2, 1, 3] Removed Element: 2
要了解更多信息ArrayBlockingQueue,請訪問Java ArrayBlockingQueue。
在Java中,BlockingQueue被視為線程安全的集合。這是因為它在多線程操作中可能會有所幫助。
假設(shè)一個線程正在將元素插入隊列,而另一個線程正在從隊列中刪除元素。
現(xiàn)在,如果第一個線程的運行速度較慢,則阻塞隊列可使第二個線程等待,直到第一個線程完成其操作。