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 LinkedBlockingQueue

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

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

Это реализованоJava BlockingQueue интерфейс.

Создание LinkedBlockingQueue

Чтобы создать блокирующую очередь списка,我们必须 импортировать пакет java.util.concurrent.LinkedBlockingQueue.

Вот как мы создаем блокирующую очередь списка в Java:

1. Без начальной емкости

LinkedBlockingQueue<Type> animal = new LinkedBlockingQueue<>();

Здесь, начальный размер по умолчанию составляет 2 31 -1.

2. С начальной емкостью

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

здесь,

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

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

Например,

//создание LinkedBlockingQueue размером 5 для типа String
LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);
//создание LinkedBlockingQueue размером 5 для типа Integer
LinkedBlockingQueue<Integer> age = new LinkedBlockingQueue<>(5);

Примечание:Не обязательно предоставлять размер списка.

Методы LinkedBlockingQueue

Класс LinkedBlockingQueue предоставляетИнтерфейс BlockingQueueРеализация всех методов.

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

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

Эти методы отличают блокирующую очередь списка от других типичных очередей.

вставка элементов

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

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

Например,

import java.util.concurrent.LinkedBlockingQueue;
class Main {
    public static void main(String[] args) {
        LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);
        // 使用 add()
        animals.add("Dog");
        animals.add("Cat");
        // 使用 offer()
        animals.offer("Horse");
        System.out.println("LinkedBlockingQueue: " + animals);
    }
}

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

LinkedBlockingQueue: [Dog, Cat, Horse]

доступ к элементам

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

  • iterator() - возвращает объект итератора, чтобы по порядку посещать элементы блокирующей очереди списка. Если очередь пуста, то выбрасывается исключение. Мы должны импортировать пакет java.util.Iterator, чтобы использовать его.

Например,

import java.util.concurrent.LinkedBlockingQueue;
import java.util.Iterator;
class Main {
    public static void main(String[] args) {
        LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);
        //添加元素
        animals.add("Dog");
        animals.add("Cat");
        animals.add("Horse");
        System.out.println("LinkedBlockingQueue: " + animals);
        // 使用 peek()
        String element = animals.peek();
        System.out.println("Доступ к элементу: " + element);
        // Использование iterator()
        Iterator<String> iterate = animals.iterator();
        System.out.print("Элементы LinkedBlockingQueue: ");
        while(iterate.hasNext()) {
            System.out.print(iterate.next());
            System.out.print(", ");
        }
    }
}

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

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

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

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

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

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

Например,

import java.util.concurrent.LinkedBlockingQueue;
class Main {
    public static void main(String[] args) {
        LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);
        animals.add("Dog");
        animals.add("Cat");
        animals.add("Horse");
        System.out.println("LinkedBlockingQueue " + 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("Обновленная LinkedBlockingQueue " + animals);
    }
}

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

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

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

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

Метод put()

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

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

Например,

import java.util.concurrent.LinkedBlockingQueue;
class Main {
    public static void main(String[] args) {
        LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);
       try {
          //Добавление элементов в animals
           animals.put("Собака");
           animals.put("Кот");
           System.out.println("LinkedBlockingQueue: " + animals);
        }
        catch(Exception e) {
            System.out.println(e);
        }
    }
}

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

LinkedBlockingQueue: [Собака, Кот]

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

Метод take()

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

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

Например,

import java.util.concurrent.LinkedBlockingQueue;
class Main {
    public static void main(String[] args) {
        LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);
       try {
           //Добавление элементов в animals
           animals.put("Собака");
           animals.put("Кот");
           System.out.println("LinkedBlockingQueue: " + animals);
           //Удаление одного элемента
           String element = animals.take();
           System.out.println("Удаление элемента: " + element);
           System.out.println("Новая LinkedBlockingQueue: " + animals);
        }
        catch(Exception e) {
            System.out.println(e);
        }
    }
}

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

LinkedBlockingQueue: [Собака, Кот]
Удаление элемента: [Собака]
Новая LinkedBlockingQueue: [Кот]

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

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

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

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

LinkedBlockingQueue использует список в качестве своего внутреннего хранения.

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

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

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