English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Основной учебник Java

Java流程控制

Java数组

Java面向对象(I)

Java Ориентированность на объекты (II)

Java Ориентированность на объекты (III)

Обработка исключений Java

Java Список (List)

Java Очередь (Queue)

Java Карта (Map)

Java Множество (Set)

Java Вход/Вывод (I/O)

Java Reader/Writer

Другие темы Java

Java ArrayBlockingQueue

В этом руководстве мы будем изучать класс ArrayBlockingQueue и его методы с помощью примеров.

Класс ArrayBlockingQueue в фреймворке Java Collections предоставляет реализацию блокирующей очереди с использованием массива.

Он реализуетJava интерфейс BlockingQueue.

Создание ArrayBlockingQueue

Для создания массива блокирующей очереди необходимо импортировать пакет java.util.concurrent.ArrayBlockingQueue.

После импорта пакета можно использовать следующие методы для создания массива блокирующей очереди в Java:

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

Здесь:

  • Type - тип массива блокирующей очереди

  • capacity - размер массива блокирующей очереди

Например,

//Создание массива блокирующей очереди размером 5 для типа String
ArrayBlockingQueue<String> animals = new ArrayBlockingQueue<>(5);
//Создание массива блокирующей очереди размером 5 для типа Integer
ArrayBlockingQueue<Integer> 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<String> animals = new ArrayBlockingQueue<>(5);
        //Использование add()
        animals.add("Dog");
        animals.add("Cat");
        //Использование 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<String> animals = new ArrayBlockingQueue<>(5);
        // Добавление элементов
        animals.add("Dog");
        animals.add("Cat");
        animals.add("Horse");
        System.out.println("ArrayBlockingQueue: " + animals);
        // Использование peek()
        String element = animals.peek();
        System.out.println("Доступ к элементу: " + element);
        // Использование iterator()
        Iterator<String> iterate = animals.iterator();
        System.out.print("Элементы ArrayBlockingQueue: ");
        while(iterate.hasNext()) {
            System.out.print(iterate.next());
            System.out.print(", ");
        }
    }
}

Результат вывода

ArrayBlockingQueue: [Dog, Cat, Horse]
Доступ к элементу: Dog
Элементы ArrayBlockingQueue: Dog, Cat, Horse,

Удаление элемента

  • remove() - Возвращает и удаляет указанный элемент из массива блокирующей очереди. Если очередь пуста, то выбрасывает исключение.

  • poll() - Возвращает и удаляет указанный элемент из массива блокирующей очереди. Если очередь пуста,则在озвращает null.

  • clear() - Удаляет все элементы из массива блокирующей очереди.

Например,

import java.util.concurrent.ArrayBlockingQueue;
class Main {
    public static void main(String[] args) {
        ArrayBlockingQueue<String> animals = new ArrayBlockingQueue<>(5);
        animals.add("Dog");
        animals.add("Cat");
        animals.add("Horse");
        System.out.println("ArrayBlockingQueue: " + animals);
        // Использование remove()
        String element1 = animals.remove();
        System.out.println("Удаление элемента:");
        System.out.println("Использование remove(): " + element1);
        // Использование poll()
        String element2 = animals.poll();
        System.out.println("Использование poll(): " + element2);
        // Использование clear()
        animals.clear();
        System.out.println("Обновленный ArrayBlockingQueue: " + animals);
    }
}

Результат вывода

ArrayBlockingQueue: [Dog, Cat, Horse]
Удаление элемента:
Используя remove(): Dog
Используя poll(): Cat
Обновленный ArrayBlockingQueue: []

Методы put() и take()

В многопоточных процессах мы можем использовать put() и take() для блокировки операции одного потока, чтобы синхронизировать его с другим потоком. Эти методы будут ждать, пока они не смогут успешно выполнить.

Метод put()

Чтобы добавить элемент в конец массива блокирующей очереди, можно использовать метод put().

Если массив блокирующей очереди полон, он будет ждать, пока в массиве блокирующей очереди не появится достаточно места для добавления элемента.

Например,

import java.util.concurrent.ArrayBlockingQueue;
class Main {
    public static void main(String[] args) {
        ArrayBlockingQueue<String> animals = new ArrayBlockingQueue<>(5);
       try {
           //Добавление элементов в 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<String> animals = new ArrayBlockingQueue<>(5);
       try {
           //Добавление элементов в animals
           animals.put("Dog");
           animals.put("Cat");
           System.out.println("ArrayBlockingQueue: " + animals);
           //Удаление одного элемента
           String element = animals.take();
           System.out.println("Удаленный элемент: " + element);
        }
        catch(Exception e) {
            System.out.println(e);
        }
    }
}

Результат вывода

ArrayBlockingQueue: [Dog, Cat]
Удаленный элемент: Dog

Здесь, если метод take() прерван в процессе ожидания, он выбрасывает исключение InterruptedException. Поэтому我们必须 его заключить в блок try...catch.

Другие методы

МетодыОписание содержимого
contains(element)Поиск указанного элемента в массиве блокирующей очереди.Возвращает true, если элемент найден,否则 возвращает false.
size()Возврат размера массива блокирующей очереди.
toArray()Преобразование массива блокирующей очереди в массив и возврат его.
toString()Преобразование массива блокирующей очереди в строку

Почему использовать ArrayBlockingQueue?

ArrayBlockingQueue использует массив в качестве своего внутреннего хранилища.

Это считается线程安全的сборник. Поэтому он обычно используется в многопоточных приложениях.

Предположим, что один поток вставляет элементы в очередь, а другой поток удаляет элементы из очереди.

Теперь, если первый поток slower, чем второй поток, то массив блокирующей очереди позволяет второму потоку ждать, пока первый поток не завершит свою операцию.