📜  Java ArrayBlockingQueue

📅  最后修改于: 2020-09-26 13:33:03             🧑  作者: Mango

在本教程中,我们将借助示例来学习ArrayBlockingQueue类及其方法。

Java Collections框架的ArrayBlockingQueue类提供了使用数组的阻塞队列实现。

它实现了Java BlockingQueue接口。

ArrayBlockingQueue用Java实现BlockingQueue接口。


创建ArrayBlockingQueue

为了创建一个数组阻止队列,我们必须导入java.util.concurrent.ArrayBlockingQueue包。

导入包后,可以使用以下方法在Java中创建数组阻止队列:

ArrayBlockingQueue animal = new ArrayBlockingQueue<>(int capacity);

这里,

  • Type-数组阻止队列的类型
  • 容量 -阵列阻塞队列的大小

例如,

// Creating String type ArrayBlockingQueue with size 5
ArrayBlockingQueue animals = new ArrayBlockingQueue<>(5);

// Creating Integer type ArrayBlockingQueue with size 5
ArrayBlockingQueue age = new ArrayBlockingQueue<>(5);

注意:必须提供阵列的大小。


ArrayBlockingQueue的方法

ArrayBlockingQueue类提供BlockingQueue接口中所有方法的实现。

这些方法用于从数组阻止队列中插入,访问和删除元素。

此外,我们还将学习支持数组阻塞队列中的阻塞操作的两种方法put()take()

这两种方法将阵列阻塞队列与其他典型队列区分开。


插入元素

  • add() -将指定的元素插入到数组阻止队列中。如果队列已满,它将引发异常。
  • offer() -将指定的元素插入数组阻止队列。如果队列已满,则返回false

例如,

import java.util.concurrent.ArrayBlockingQueue;

class Main {
    public static void main(String[] args) {
        ArrayBlockingQueue animals = new ArrayBlockingQueue<>(5);

        // Using add()
        animals.add("Dog");
        animals.add("Cat");

        // Using offer()
        animals.offer("Horse");
        System.out.println("ArrayBlockingQueue: " + animals);
    }
}

输出

ArrayBlockingQueue: [Dog, Cat, Horse]

访问元素

  • peek() -从数组阻止队列的前面返回一个元素。如果队列为空,则返回null
  • iterator() -返回一个迭代器对象,以顺序访问数组阻止队列中的元素。如果队列为空,则抛出异常。我们必须导入java.util.Iterator包才能使用它。

例如,

import java.util.concurrent.ArrayBlockingQueue;
import java.util.Iterator;

class Main {
    public static void main(String[] args) {
        ArrayBlockingQueue animals = new ArrayBlockingQueue<>(5);

        // Add elements
        animals.add("Dog");
        animals.add("Cat");
        animals.add("Horse");
        System.out.println("ArrayBlockingQueue: " + animals);

        // Using peek()
        String element = animals.peek();
        System.out.println("Accessed Element: " + element);

        // Using iterator()
        Iterator iterate = animals.iterator();
        System.out.print("ArrayBlockingQueue Elements: ");

        while(iterate.hasNext()) {
            System.out.print(iterate.next());
            System.out.print(", ");
        }
    }
}

输出

ArrayBlockingQueue: [Dog, Cat, Horse]
Accessed Element: Dog
ArrayBlockingQueue Elements: Dog, Cat, Horse,

删除元素

  • remove() -返回并从数组阻止队列中删除指定的元素。如果队列为空,则抛出异常。
  • poll() -返回并从数组阻止队列中删除指定的元素。如果队列为空,则返回null
  • clear() -从数组阻止队列中删除所有元素。

例如,

import java.util.concurrent.ArrayBlockingQueue;

class Main {
    public static void main(String[] args) {
        ArrayBlockingQueue animals = new ArrayBlockingQueue<>(5);

        animals.add("Dog");
        animals.add("Cat");
        animals.add("Horse");
        System.out.println("ArrayBlockingQueue: " + animals);

        // Using remove()
        String element1 = animals.remove();
        System.out.println("Removed Element:");
        System.out.println("Using remove(): " + element1);

        // Using poll()
        String element2 = animals.poll();
        System.out.println("Using poll(): " + element2);

        // Using clear()
        animals.clear();
        System.out.println("Updated ArrayBlockingQueue: " + animals);
    }
}

输出

ArrayBlockingQueue: [Dog, Cat, Horse]
Removed Elements:
Using remove(): Dog
Using poll(): Cat
Updated ArrayBlockingQueue: []

put()和take()方法

在多线程处理中,我们可以使用put()take()阻止一个线程的操作,以使其与另一个线程同步。这些方法将等待,直到可以成功执行。


put()方法

要将元素添加到数组阻塞队列的末尾,可以使用put()方法。

如果阵列阻塞队列已满,它将等待,直到阵列阻塞队列中有空间可添加元素。

例如,

import java.util.concurrent.ArrayBlockingQueue;

class Main {
    public static void main(String[] args) {
        ArrayBlockingQueue animals = new ArrayBlockingQueue<>(5);

       try {
        // Add elements to animals
           animals.put("Dog");
           animals.put("Cat");
           System.out.println("ArrayBlockingQueue: " + animals);
        }
        catch(Exception e) {
            System.out.println(e);
        }
    }
}

输出

ArrayBlockingQueue: [Dog, Cat]

在这里,如果put()方法在等待时被中断,则可能会抛出InterruptedException 。因此,我们必须将其包含在try..catch块中。


take()方法

要从数组阻塞队列的前面返回并删除一个元素,可以使用take()方法。

如果阵列阻塞队列为空,它将等待,直到阵列阻塞队列中有要删除的元素为止。

例如,

import java.util.concurrent.ArrayBlockingQueue;

class Main {
    public static void main(String[] args) {
        ArrayBlockingQueue animals = new ArrayBlockingQueue<>(5);

       try {
           //Add elements to animals
           animals.put("Dog");
           animals.put("Cat");
           System.out.println("ArrayBlockingQueue: " + animals);

           // Remove an element
           String element = animals.take();
           System.out.println("Removed Element: " + element);
        }
        catch(Exception e) {
            System.out.println(e);
        }
    }
}

输出

ArrayBlockingQueue: [Dog, Cat]
Removed Element: Dog

在这里,如果take()方法在等待时被中断,则会抛出InterrupedException 。因此,我们必须将其包含在try...catch块中。


其他方法
Methods Descriptions
contains(element) Searches the array blocking queue for the specified element.If the element is found, it returns true, if not it returns false.
size() Returns the length of the array blocking queue.
toArray() Converts array blocking queue to an array and returns it.
toString() Converts the array blocking queue to string

为什么要使用ArrayBlockingQueue?

ArrayBlockingQueue使用数组作为其内部存储。

它被认为是线程安全的集合。因此,它通常用于多线程应用程序中。

假设一个线程正在将元素插入队列,而另一个线程正在从队列中删除元素。

现在,如果第一个线程比第二个线程慢,那么数组阻塞队列可以使第二个线程等待,直到第一个线程完成其操作。