Java 菜鳥教程

Java 流程控制

Java 數(shù)組

Java 面向?qū)ο?I)

Java 面向?qū)ο?II)

Java 面向?qū)ο?III)

Java 異常處理

Java 列表(List)

Java Queue(隊列)

Java Map集合

Java Set集合

Java 輸入輸出(I/O)

Java Reader/Writer

Java 其他主題

Java BlockingQueue

在本教程中,我們將學(xué)習(xí)Java BlockingQueue接口及其方法。

Java Collections框架的BlockingQueue接口擴展了Queue接口。它允許任何操作等待,直到成功執(zhí)行。

例如,如果我們要從空隊列中刪除元素,則阻塞隊列允許刪除操作等待,直到隊列中包含一些要刪除的元素。

實現(xiàn)BlockingQueue的類

由于BlockingQueue是一個接口,因此我們無法提供它的直接實現(xiàn)。

為了使用BlockingQueue的功能,我們需要使用實現(xiàn)它的類。

ArrayBlockingQueue和LinkedBlockingQueue在Java中實現(xiàn)BlockingQueue接口。

如何使用阻塞隊列?

我們必須導(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接口的功能。

BlockingQueue的方法

根據(jù)隊列是滿還是空,阻塞隊列的方法可以分為3類:

引發(fā)異常的方法

  • 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的操作方法

BlockingQueue還提供了一些方法來阻塞操作和等待,如果隊列滿或空。

  • put() - 將元素插入到阻塞隊列。 如果隊列已滿,它將等待直到隊列有空間插入元素。

  • take() - 從阻塞隊列中移除并返回一個元素。如果隊列為空,它將等待,直到隊列中有要刪除的元素。

假設(shè),我們想要向隊列中插入元素。如果隊列已滿,那么put()方法將等待,直到隊列有空間插入元素。

同樣,如果我們想從隊列中刪除元素。如果隊列為空,那么take()方法將等待,直到隊列包含要刪除的元素。

ArrayBlockingQueue中BlockingQueue的實現(xiàn)

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。

為什么選擇BlockingQueue?

在Java中,BlockingQueue被視為線程安全的集合。這是因為它在多線程操作中可能會有所幫助。

假設(shè)一個線程正在將元素插入隊列,而另一個線程正在從隊列中刪除元素。

現(xiàn)在,如果第一個線程的運行速度較慢,則阻塞隊列可使第二個線程等待,直到第一個線程完成其操作。

丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清