Автор оригинала: Pankaj Kumar.
Сегодня мы рассмотрим Java BlockingQueue. java.util.concurrent.BlockingQueue -это очередь java, поддерживающая операции, которые ожидают, пока очередь не станет пустой при извлечении и удалении элемента, и ждут, пока освободится место в очереди при добавлении элемента.
Java блокирующая очередь
Java BlockingQueue не принимает значения null и выдает исключение NullPointerException |/при попытке сохранить значение null в очереди.
Реализации Java BlockingQueue являются потокобезопасными . Все методы организации очередей являются атомарными по своей природе и используют внутренние блокировки или другие формы контроля параллелизма.
Интерфейс Java BlockingQueue является частью платформы java collections и в основном используется для реализации проблемы производителя-потребителя. Нам не нужно беспокоиться о том, чтобы ждать, пока пространство будет доступно для производителя или объект будет доступен для потребителя в BlockingQueue, потому что оно обрабатывается классами реализации BlockingQueue.
Java предоставляет несколько реализаций блокирующей очереди, таких как ArrayBlockingQueue , LinkedBlockingQueue , Приоритетная блокирующая очередь , Синхронная очередь и т. Д.
При реализации проблемы производителя-потребителя в BlockingQueue мы будем использовать реализацию ArrayBlockingQueue. Ниже приведены некоторые важные методы, которые вы должны знать.
put(E e): Этот метод используется для вставки элементов в очередь. Если очередь заполнена, она ждет, пока освободится место.E take(): Этот метод извлекает и удаляет элемент из начала очереди. Если очередь пуста, она ожидает, пока элемент будет доступен.
Давайте теперь реализуем проблему производителя-потребителя с помощью java BlockingQueue.
Пример Java BlockingQueue – Сообщение
Просто обычный объект java, который будет создан производителем и добавлен в очередь. Вы также можете назвать его полезной нагрузкой или сообщением очереди.
package com.journaldev.concurrency;
public class Message {
private String msg;
public Message(String str){
this.msg=str;
}
public String getMsg() {
return msg;
}
}
Пример Java BlockingQueue – Производитель
Класс производителя, который будет создавать сообщения и помещать их в очередь.
package com.journaldev.concurrency;
import java.util.concurrent.BlockingQueue;
public class Producer implements Runnable {
private BlockingQueue queue;
public Producer(BlockingQueue q){
this.queue=q;
}
@Override
public void run() {
//produce messages
for(int i=0; i<100; i++){
Message msg = new Message(""+i);
try {
Thread.sleep(i);
queue.put(msg);
System.out.println("Produced "+msg.getMsg());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//adding exit message
Message msg = new Message("exit");
try {
queue.put(msg);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Пример Java BlockingQueue – Потребитель
Класс потребителя, который будет обрабатывать сообщения из очереди и завершится при получении сообщения о выходе.
package com.journaldev.concurrency;
import java.util.concurrent.BlockingQueue;
public class Consumer implements Runnable{
private BlockingQueue queue;
public Consumer(BlockingQueue q){
this.queue=q;
}
@Override
public void run() {
try{
Message msg;
//consuming messages until exit message is received
while((msg = queue.take()).getMsg() !="exit"){
Thread.sleep(10);
System.out.println("Consumed "+msg.getMsg());
}
}catch(InterruptedException e) {
e.printStackTrace();
}
}
}
Пример Java BlockingQueue – Сервис
Наконец, мы должны создать сервис BlockingQueue для производителя и потребителя. Эта служба производителей и потребителей создаст блокирующую очередь с фиксированным размером и предоставит доступ как производителям, так и потребителям. Эта служба запустит потоки производителей и потребителей и завершит работу.
package com.journaldev.concurrency;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
public class ProducerConsumerService {
public static void main(String[] args) {
//Creating BlockingQueue of size 10
BlockingQueue queue = new ArrayBlockingQueue<>(10);
Producer producer = new Producer(queue);
Consumer consumer = new Consumer(queue);
//starting producer to produce messages in queue
new Thread(producer).start();
//starting consumer to consume messages from queue
new Thread(consumer).start();
System.out.println("Producer and Consumer has been started");
}
}
Вывод приведенного выше примера программы java BlockingQueue показан ниже.
Producer and Consumer has been started Produced 0 Produced 1 Produced 2 Produced 3 Produced 4 Consumed 0 Produced 5 Consumed 1 Produced 6 Produced 7 Consumed 2 Produced 8 ...
Спящий режим потока Java используется в производителе и потребителе для создания и использования сообщений с некоторой задержкой.