В этом руководстве мы узнаем о классе ArrayBlockingQueue и его методах с помощью примеров.
ArrayBlockingQueue
Класс рамок Java Collections предусматривает реализацию блокировки очереди , используя массив.
Он реализует интерфейс Java BlockingQueue.
Создание ArrayBlockingQueue
Чтобы создать очередь блокировки массива, мы должны импортировать java.util.concurrent.ArrayBlockingQueue
пакет.
После импорта пакета вот как мы можем создать очередь блокировки массива в Java:
ArrayBlockingQueue animal = new ArrayBlockingQueue(int capacity);
Вот,
- Тип - тип очереди блокировки массива
- capacity - размер очереди блокировки массива
Например,
// 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: (Собака, Кот, Лошадь)
Элементы доступа
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) Доступный элемент: Dog Элементы ArrayBlockingQueue: 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) Удаленные элементы: Использование 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 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: (Собака, Кот)
Здесь 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) Удаленный элемент: Dog
Здесь take()
метод выдаст, InterrupedException
если он будет прерван во время ожидания. Следовательно, мы должны заключить его в try… catch
блок.
Другие методы
Методы | Описания |
---|---|
contains(element) | Ищет указанный элемент в очереди блокировки массива. Если элемент найден, он возвращается true , если нет - возвращается false . |
size() | Возвращает длину очереди блокировки массива. |
toArray() | Преобразует очередь блокировки массива в массив и возвращает его. |
toString() | Преобразует очередь блокировки массива в строку |
Зачем использовать ArrayBlockingQueue?
В ArrayBlockingQueue
качестве внутреннего хранилища использует массивы.
Это считается поточно-ориентированной коллекцией. Следовательно, он обычно используется в многопоточных приложениях.
Предположим, один поток вставляет элементы в очередь, а другой поток удаляет элементы из очереди.
Теперь, если первый поток медленнее, чем второй поток, то очередь блокировки массива может заставить второй поток ждать, пока первый поток не завершит свои операции.