Что такое BlockingQueue в Java и как его реализовать?



Эта статья о BlockingQueue в Java поможет вам узнать об интерфейсе BlockingQueue. Это также даст вам представление о его методах и практической реализации.

чрезвычайно популярен среди программистов из-за обширного набора встроенных функций. В большинстве случаев у вас будет специальное решение для вашей проблемы еще до того, как оно появится. Такая чрезвычайно полезная и важная часть - это интерфейс BlockingQueue в Java. В этой статье я расскажу о BlockingQueue в Java и о методах его реализации.

Ниже приведены темы, затронутые в этой статье:





как установить путь Java

Интерфейс BlockingQueue в Java

BlockingQueue в Java - это интерфейс, который был добавлен в Java 1.5 вместе с несколькими другими параллельными служебными классами, такими как ConcurrentHashMap, CopyOnWriteArrrayList и т. д. Интерфейс BlockingQueue принадлежит к java.util.concurrent пакет .Этот интерфейс улучшает управление потоком, активируя блокировку в случае, если поток пытается исключить из очереди пустую очередь или поставить полную очередь. В любом случае этот интерфейс пригодится.Проще говоря, предположим, что пытается добавить элементы в уже заполненную очередь. На этом этапе программы будет вызвана BlockingQueue, которая заблокирует этот конкретный поток, пока другой поток не освободит очередь, чтобы освободить место. Это может быть результатом удаления из очереди элемента (ов) очистки всей очереди. Точно так же BlockingQueue будет вызываться для блокировки потока, пытающегося исключить уже пустую очередь, пока какой-либо другой поток не вставит или не добавит элемент в пустую очередь .

При работе с интерфейсом BlockingQueue в Java вы должны помнить, что он не принимает нулевое значение. Если вы попытаетесь это сделать, он мгновенно выдаст исключение NullPointerException. На рисунке ниже представлена ​​работа интерфейса BlockingQueue в Java.



BlockingQueue - BlockingQueue в Java - EdurekaЭта интерфейс в основном используется между производителем и потребителем, поскольку он является потокобезопасным.Я имею в виду, что интерфейс BlockingQueue можно использовать для создания очереди, которая может использоваться как производителем, так и потребителем.

Чтобы работать с BlockingQueue в Java, сначала необходимо ознакомиться с его типами. Позвольте познакомить вас с ними в следующем разделе этой статьи.

Типы конструкторов для BlockingQueue в Java

В Java есть два типа конструкторов для интерфейса BlockingQueue:



  • Неограниченная очередь: Для этого типа очереди емкость будет установлена ​​на Integer.MAX_VALUE. Неограниченная очередь никогда не будет заблокирована, поскольку она может динамически расти каждый раз, когда в нее вставляется элемент. Ниже приведен синтаксис для создания неограниченной очереди:
BlockingQueue bq = новый LinkedBlockingDeque ()
  • Ограниченная очередь: Для этого типа очереди вам необходимо передать емкость очереди на момент ее создания, то есть как строитель параметр. После того, как размер назначен, его нельзя изменить. Ниже приведен синтаксис для создания ограниченной очереди:
BlockingQueue bq = новый LinkedBlockingDeque (10)

Теперь, когда вы знакомы со способами реализации BlockingQueue в Java, позвольте мне перечислить несколько его методов.

Методы в интерфейсе BlockingQueue

Метод Описание
логическое сложение (E e) Этот метод помогает вставить указанный элемент в эту очередь, если в очереди есть место, иначе он будетброситьIllegalStateException
логическое содержит (Объект o) Этот метод возвращает истину, если очередь содержит указанный элемент.
int DrainTo (Коллекция c) Этот метод удалит все доступные элементы из очереди и добавит их в указанную коллекцию.
int DrainTo (Коллекция c, int maxElements) Этот метод удалит указанное количество доступных элементов из очереди и добавит их в указанное
булевское предложение (E e) Этот метод вставит указанный элемент в очередь, если она не заполнена, и вернет true, иначе он вернет false
логическое предложение (E e, длительный тайм-аут, единица TimeUnit) Этот метод вставит указанный элемент в очередь. Если очередь заполнена, она будет ждать до указанного времени ожидания, чтобы пространство стало доступным.
E опрос (длинный тайм-аут, единица времени) Этот метод помогает получить и удалить заголовок очереди. Если очередь пуста, она будет ждать до указанного времени ожидания, чтобы элемент стал доступным.
void put (E e) Этот метод вставит указанный элемент в очередь, ожидая, пока освободится место, в случае, если очередь заполнена.
int оставшийсяCapacity () Этот метод помогает вернуть количество дополнительных элементов, которые эта очередь может идеально принять без блокировки.
логическое удаление (объект o) Этот метод удалит единственный экземпляр указанного элемента из очереди, только если он присутствует.
E взять () Этот метод поможет получить и удалить заголовок очереди, ожидая, пока элемент станет доступным, если очередь пуста.

Реализации BlockingQueue

Здесь я буду реализовывать простой пример BlockingQueue на Java, гдеclass EduProducer будет генерировать данные и вставлять их в очередь одновременно с этим другой класс, EduConsumer, удалит данные из той же очереди.

Для этого я создам 3 класса, а именно:

  1. EduProducer
  2. EduConsumer
  3. ЭдурекаГлавная

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

EduProducer.java

package edureka import java.util.concurrent.BlockingQueue открытый класс EduProducer реализует Runnable {private final BlockingQueue queue @Override public void run () {try {process ()} catch (InterruptedException e) {Thread.currentThread (). interrupt ()} } private void process () выбрасывает InterruptedException {// Помещаем 10 целых чисел в очередь для (int i = 0 i<10 i++) { System.out.println('[Producer] Add : ' + i) queue.put(i) System.out.println('[Producer] Queue's Remaining Capacity : ' + queue.remainingCapacity()) Thread.sleep(150) } } public EduProducer(BlockingQueue queue) { this.queue = queue } }

EduConsumer.java

package edureka import java.util.concurrent.BlockingQueue публичный класс EduConsumer реализует Runnable {private final BlockingQueue queue @Override public void run () {try {while (true) {Integer take = queue.take () process (take)}} catch (InterruptedException e) {Thread.currentThread (). Interrupt ()}} private void process (Integer take) выдает InterruptedException {System.out.println ('[Consumer] Remove:' + take) Thread.sleep (500)} public EduConsumer (очередь BlockingQueue) {this.queue = queue}}

EdurekaMain.java

package edureka import java.util.concurrent.BlockingQueue import java.util.concurrent.LinkedBlockingQueue открытый класс EdurekaMain {public static void main (String [] args) {BlockingQueue queue = new LinkedBlockingQueue (10) new Thread (new EduProducer (queue)) .start () новый поток (новый EduConsumer (очередь)). start ()}}

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

[Производитель] Добавить: 0 [Потребитель] Дубль: 0 [Производитель] Оставшаяся емкость очереди: 9 [Производитель] Добавить: 1 [Производитель] Оставшаяся емкость очереди: 9 [Производитель] Добавить: 2 [Производитель] Оставшаяся емкость очереди: 8 [Производитель] ] Добавить: 3 [Производитель] Оставшаяся емкость очереди: 7 [Потребитель] Дубль: 1 [Производитель] Добавить: 4 [Производитель] Оставшаяся емкость очереди: 7 [Производитель] Добавить: 5 [Производитель] Оставшаяся емкость очереди: 6 [Производитель] Добавить : 6 [Производитель] Оставшаяся емкость очереди: 5 [Потребитель] Дубль: 2 [Производитель] Добавить: 7 [Производитель] Оставшаяся емкость очереди: 5 [Производитель] Добавить: 8 [Производитель] Оставшаяся емкость очереди: 4 [Производитель] Добавить: 9 [Производитель] Оставшаяся емкость очереди: 3 [Потребитель] Точка: 3 [Потребитель] Точка: 4 [Потребитель] Точка: 5 [Потребитель] Точка: 6 [Потребитель] Точка: 7 [Потребитель] Точка: 8 [Потребитель] Точка: 9

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

Теперь, когда вы разобрались с основами BlockingQueue в Java, ознакомьтесь с от Edureka, надежной компании по онлайн-обучению с сетью из более чем 250 000 довольных учащихся по всему миру. Курс Edureka по обучению и сертификации Java J2EE и SOA предназначен для студентов и профессионалов, которые хотят стать Java-разработчиками. Курс разработан, чтобы дать вам хорошее начало в программировании на Java и обучить вас как основным, так и продвинутым концепциям Java, а также различным фреймворкам Java, таким как Hibernate и Spring.

исходный код c ++ сортировки слиянием

Есть вопрос к нам? Пожалуйста, укажите это в комментариях к этой «BlockingQueue в Java», и мы свяжемся с вами как можно скорее.