betacode

Руководство Java ArrayBlockingQueue

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

1- ArrayBlockingQueue

ArrayBlockingQueue<E> - это класс, который реализует интерфейс BlockingQueue<E>, поэтому он обладает всеми функциями этого интерфейса. Смотрите статью о BlockingQueue для лучшего понимания с основными примерами.

public class ArrayBlockingQueue<E> extends AbstractQueue<E>
                          implements BlockingQueue<E>, java.io.Serializable
ArrayBlockingQueue - это очередь с ограниченной емкостью, которая содержит внутренний массив фиксированной длины для хранения элементов. Эта очередь сортирует элементы в соответствии с правилом FIFO - First In First Out (первым вошел первым вышел). Элементы в начале очереди - это элементы, которые находились в очереди дольше всего, элементы в конце очереди - это недавно добавленные элементы.
На следующем рисунке показано, как ArrayBlockingQueue сохраняет свои элементы во внутреннем массиве.
  • Добавление нового элемента в эту очередь соответствует присвоению нового значения элементу массива в putIndex. Кроме того, если putIndex равен 0, он будет присвоен arrayLength-1, в противном случае ему будет присвоен putIndex-1.
  • Извлечение элемента из этой очереди соответствует возвращению элемента массива в takeIndex. Кроме того, если takeIndex равен 0, ему будет присвоена arrayLength-1, в противном случае ему будет takeIndex-1.
ArrayBlockingQueue поддерживает справедливую политику в качестве опции при создании объектов. Как только политика справедливости будет использована, эта очередь будет соответствовать порядку, в котором ожидают потоки Producer и Consumer. Это позволяет избежать истощения определенного thread, такого как голодающий thread Consumer из-за длительного времени ожидания без получения какого-либо элемента из очереди.
ArrayBlockingQueue и его Iterator поддерживают все дополнительные методы, определенные в интерфейсах Collection и Iterator.

2- Constructors

Конструкторы класса ArrayBlockingQueue:

public ArrayBlockingQueue(int capacity)  
public ArrayBlockingQueue(int capacity, boolean fair)  
public ArrayBlockingQueue(int capacity, boolean fair, Collection<? extends E> c)

3- ArrayBlockingQueue(int)


public ArrayBlockingQueue(int capacity)  
Создает объект ArrayBlockingQueue с указанной (фиксированной) емкостью. Использование этого конструктора эквивалентно использованию конструктора ArrayBlockingQueue(capacity,false).
"Справедливая" политика не применяется к объекту ArrayBlockingQueue, созданному этим конструктором, поведение которого не определено.

4- ArrayBlockingQueue(int, boolean)


public ArrayBlockingQueue(int capacity, boolean fair)  
Создает объект ArrayBlockingQueue с заданной (фиксированной) емкостью, с заданной "справедливой" политикой.
fair = true
К этой очереди будет применена "справедливая" политика, которая учитывает порядок, в котором thread Producer и Consumer ожидают в соответствии с правилами FIFO, это означает, что thread, который ожидает первым, будет обработан первым.
"Справедливая" политика помогает избежать истощения определенного thread, например, Consumer долго ждет, но не получает никаких элементов из очереди.
fair = false
"Справедливая" политика не применяется, порядок обработки thread не определен

5- ArrayBlockingQueue(int, boolean, Collection)


public ArrayBlockingQueue(int capacity, boolean fair, Collection<? extends E> c)
Создает объект ArrayBlockingQueue с указанной (фиксированной) емкостью, указанной "справедливой" политикой и предоставленными начальными элементами.
Например:

Collection<String> initialElements = List.of("A", "B", "C");
BlockingQueue<String> queue = new ArrayBlockingQueue<>(10, true, initialElements);

6- Methods

Методы, унаследованные от интерфейса BockingQueue<E>:

void put(E e) throws InterruptedException;
boolean offer(E e, long timeout, TimeUnit unit) throws InterruptedException;
E take() throws InterruptedException;
E poll(long timeout, TimeUnit unit) throws InterruptedException;
int remainingCapacity();
int drainTo(Collection<? super E> c);  
int drainTo(Collection<? super E> c, int maxElements);
Смотрите статью о BlockingQueue, чтобы узнать, как использовать описанные выше методы.
Методы, унаследованные от интерфейса Queue<E>:

boolean add(E e);
boolean offer(E e);
E remove();
E poll();
E element();
E peek();
Методы унаследованы от интерфейса Collection<E>:

int size();
boolean isEmpty();
boolean contains(Object o);
Iterator<E> iterator();
Object[] toArray();
<T> T[] toArray(T[] a);
boolean add(E e);
boolean remove(Object o);
boolean containsAll(Collection<?> c);  
boolean addAll(Collection<? extends E> c);
boolean removeAll(Collection<?> c);
boolean retainAll(Collection<?> c);
void clear();  
boolean equals(Object o);
int hashCode();

default <T> T[] toArray(IntFunction<T[]> generator)  
default boolean removeIf(Predicate<? super E> filter)
default Spliterator<E> spliterator()  
default Stream<E> stream()  
default Stream<E> parallelStream()
  • TODO Link?