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 BlockingQueue

В этом руководстве мы изучим интерфейс Java BlockingQueue и его методы.

Интерфейс BlockingQueue в фреймворке Java Collections расширяет интерфейс Queue. Он позволяет любым операциям ждать до успешного выполнения.

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

Классы, реализующие BlockingQueue

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

Чтобы использовать функции BlockingQueue, нам нужно использовать классы, реализующие его.

Как использовать блокирующую очередь?

Чтобы использовать BlockingQueue,我们必须 импортировать пакет java.util.concurrent.BlockingQueue.

// Реализация Array для BlockingQueue
BlockingQueue<String> animal1 = new ArraryBlockingQueue<>();
// Реализация LinkedList для BlockingQueue
BlockingQueue<String> animal2 = new LinkedBlockingQueue<>();

Здесь мы создаем объекты classes ArrayBlockingQueue и LinkedBlockingQueue animal1 и animal2. Эти объекты могут использовать функции интерфейса BlockingQueue.

Методы BlockingQueue

В зависимости от того, полна или пуста очередь, методы блокирующей очереди можно разделить на 3 класса:

Методы для抛ания исключений

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

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

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

Методы для возврата значений

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

  • peek() - возвращает голову блокирующей очереди. Если очередь пуста, возвращается null.

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

offer() и poll()Более подробная информация

Методы offer() и poll() могут использоваться с timeout. Это означает, что мы можем передавать единицу времени в качестве параметра. Например,

offer(value, 100, milliseconds)}

Здесь,

  • value - это элемент, который нужно вставить в очередь

  • и мы установим таймаут в 100 миллисекунд

Это означает, что метод offer() попытается вставить элемент в блокирующую очередь в течение 100 миллисекунд. Если за 100 миллисекунд элемент не вставлен, метод вернет false.

Примечание:Кроме миллисекунд, мы можем использовать следующие единицы времени в методах offer() и poll(): дни, часы, минуты, секунды, микросекунды и наносекунды.

Методы операции BlockingQueue

BlockingQueue также предоставляет некоторые методы для блокировки операций и ожидания, если очередь полна или пуста.

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

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

Предположим, мы хотим вставить элемент в очередь. Если очередь полна, то метод put() будет ждать, пока очередь не освободится для вставки элемента.

Также, если мы хотим удалить элемент из очереди. Если очередь пуста, то метод take() будет ждать, пока очередь не содержит элемента, который нужно удалить.

Реализация BlockingQueue в ArrayBlockingQueue

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ArrayBlockingQueue;
class Main {
    public static void main(String[] args) {
      //Создание блокирующей очереди с использованием ArrayBlockingQueue
      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("Удаленный номер: " + removedNumber);
      }
      catch(Exception e) {
          e.getStackTrace();
      }
    }
}

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

BlockingQueue: [2, 1, 3]
Удаленный элемент: 2

Чтобы узнать больше информации о ArrayBlockingQueue, пожалуйста, посетитеJava ArrayBlockingQueue.

Почему выбрать BlockingQueue?

В Java BlockingQueue рассматривается как线程安全的коллекция. Это потому, что она может помочь в многонитевых операциях.

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

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