Учебники

Java Concurrency — интерфейс BlockingQueue

Интерфейс java.util.concurrent.BlockingQueue является подынтерфейсом интерфейса очереди и дополнительно поддерживает такие операции, как ожидание того, что очередь станет непустой перед извлечением элемента, и ожидание появления пространства в очереди перед сохранением элемента. ,

Методы блокировки

Sr.No. Метод и описание
1

логическое сложение (E e)

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

2

логическое значение содержит (объект o)

Возвращает true, если эта очередь содержит указанный элемент.

3

int driTo (Коллекция <? super E> c)

Удаляет все доступные элементы из этой очереди и добавляет их в заданную коллекцию.

4

int driTo (Коллекция <? super E> c, int maxElements)

Удаляет не более заданного количества доступных элементов из этой очереди и добавляет их в заданную коллекцию.

5

булево предложение (E e)

Вставляет указанный элемент в эту очередь, если это можно сделать немедленно, не нарушая ограничения по емкости, возвращая значение true в случае успеха и значение false, если в настоящее время нет свободного места.

6

логическое предложение (E e, длительное время ожидания, единица времени)

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

7

E опрос (длительное время ожидания, единица времени)

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

8

пустота (E e)

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

9

int оставшийсяCapacity ()

Возвращает количество дополнительных элементов, которые эта очередь может в идеале (при отсутствии ограничений памяти или ресурсов) принять без блокировки, или Integer.MAX_VALUE, если нет внутреннего ограничения.

10

логическое удаление (объект o)

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

11

E взять ()

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

логическое сложение (E e)

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

логическое значение содержит (объект o)

Возвращает true, если эта очередь содержит указанный элемент.

int driTo (Коллекция <? super E> c)

Удаляет все доступные элементы из этой очереди и добавляет их в заданную коллекцию.

int driTo (Коллекция <? super E> c, int maxElements)

Удаляет не более заданного количества доступных элементов из этой очереди и добавляет их в заданную коллекцию.

булево предложение (E e)

Вставляет указанный элемент в эту очередь, если это можно сделать немедленно, не нарушая ограничения по емкости, возвращая значение true в случае успеха и значение false, если в настоящее время нет свободного места.

логическое предложение (E e, длительное время ожидания, единица времени)

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

E опрос (длительное время ожидания, единица времени)

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

пустота (E e)

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

int оставшийсяCapacity ()

Возвращает количество дополнительных элементов, которые эта очередь может в идеале (при отсутствии ограничений памяти или ресурсов) принять без блокировки, или Integer.MAX_VALUE, если нет внутреннего ограничения.

логическое удаление (объект o)

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

E взять ()

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

пример

Следующая программа TestThread показывает использование интерфейса BlockingQueue в поточной среде.

Live Demo

import java.util.Random;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class TestThread {

   public static void main(final String[] arguments) throws InterruptedException {
      BlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(10);

      Producer producer = new Producer(queue);
      Consumer consumer = new Consumer(queue);

      new Thread(producer).start();
      new Thread(consumer).start();

      Thread.sleep(4000);
   }  


   static class Producer implements Runnable {
      private BlockingQueue<Integer> queue;

      public Producer(BlockingQueue queue) {
         this.queue = queue;
      }

      @Override
      public void run() {
         Random random = new Random();

         try {
            int result = random.nextInt(100);
            Thread.sleep(1000);
            queue.put(result);
            System.out.println("Added: " + result);
            
            result = random.nextInt(100);
            Thread.sleep(1000);
            queue.put(result);
            System.out.println("Added: " + result);
            
            result = random.nextInt(100);
            Thread.sleep(1000);
            queue.put(result);
            System.out.println("Added: " + result);
         } catch (InterruptedException e) {
            e.printStackTrace();
         }
      }	   
   }

   static class Consumer implements Runnable {
      private BlockingQueue<Integer> queue;

      public Consumer(BlockingQueue queue) {
         this.queue = queue;
      }
      
      @Override
      public void run() {
         
         try {
            System.out.println("Removed: " + queue.take());
            System.out.println("Removed: " + queue.take());
            System.out.println("Removed: " + queue.take());
         } catch (InterruptedException e) {
            e.printStackTrace();
         }
      }
   }
}

Это даст следующий результат.