Java LinkedBlockingQueue

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

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

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

Создание LinkedBlockingQueue

Чтобы создать связанную очередь блокировки, мы должны импортировать java.util.concurrent.LinkedBlockingQueueпакет.

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

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

 LinkedBlockingQueue animal = new LinkedBlockingQueue(); 

Здесь начальная емкость по умолчанию будет 2 31 -1.

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

 LinkedBlockingQueue animal = new LinkedBlockingQueue(int capacity); 

Вот,

  • Тип - тип связанной очереди блокировки
  • емкость - размер связанной очереди блокировки

Например,

 // Creating String type LinkedBlockingQueue with size 5 LinkedBlockingQueue animals = new LinkedBlockingQueue(5); // Creating Integer type LinkedBlockingQueue with size 5 LinkedBlockingQueue 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 animals = new LinkedBlockingQueue(5); // Using add() animals.add("Dog"); animals.add("Cat"); // Using offer() animals.offer("Horse"); System.out.println("LinkedBlockingQueue: " + animals); ) ) 

Вывод

 LinkedBlockingQueue: (Собака, Кот, Лошадь) 

Элементы доступа

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

Например,

 import java.util.concurrent.LinkedBlockingQueue; import java.util.Iterator; class Main ( public static void main(String() args) ( LinkedBlockingQueue animals = new LinkedBlockingQueue(5); // Add elements animals.add("Dog"); animals.add("Cat"); animals.add("Horse"); System.out.println("LinkedBlockingQueue: " + animals); // Using peek() String element = animals.peek(); System.out.println("Accessed Element: " + element); // Using iterator() Iterator iterate = animals.iterator(); System.out.print("LinkedBlockingQueue Elements: "); 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 animals = new LinkedBlockingQueue(5); animals.add("Dog"); animals.add("Cat"); animals.add("Horse"); System.out.println("LinkedBlockingQueue " + 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 LinkedBlockingQueue " + animals); ) ) 

Вывод

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

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

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

put () Метод

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

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

Например,

 import java.util.concurrent.LinkedBlockingQueue; class Main ( public static void main(String() args) ( LinkedBlockingQueue animals = new LinkedBlockingQueue(5); try ( // Add elements to animals animals.put("Dog"); animals.put("Cat"); 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 animals = new LinkedBlockingQueue(5); try ( //Add elements to animals animals.put("Dog"); animals.put("Cat"); System.out.println("LinkedBlockingQueue: " + animals); // Remove an element String element = animals.take(); System.out.println("Removed Element: " + element); System.out.println("New LinkedBlockingQueue: " + animals); ) catch(Exception e) ( System.out.println(e); ) ) ) 

Вывод

 LinkedBlockingQueue: (Dog, Cat) Удаленный элемент: Dog Новый LinkedBlockingQueue: (Cat) 

Здесь take()метод выдаст, InterrupedExceptionесли он будет прерван во время ожидания. Следовательно, мы должны заключить его в try… catchблок.

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

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

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

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

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

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

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

Интересные статьи...