Guia da interface da fila Java

Guia da interface da fila Java

1. Introdução

Neste tutorial, discutiremos a interfaceQueue do Java.

Primeiro, vamostake a peek at what a Queue does, and some of its core methods. A seguir, vamos mergulhar em uma série deimplementations that Java provides as standard.

Finalmente, vamos falar sobre segurança de thread antes de encerrar tudo.

2. Visualizando a fila

Vamos começar com uma rápida analogia.

Imagine que acabamos de abrir nosso primeiro negócio - uma barraca de cachorro-quente. Queremos atender nossos novos clientes em potencial da maneira mais eficiente possível para nossos pequenos negócios; um por vez. Primeiro, pedimos que eles formem uma linha ordenada em frente ao nosso estande, com novos clientes entrando na parte traseira. Graças às nossas habilidades de organização, agora podemos distribuir nossos saborosos cachorros-quentes de maneira justa.

Queues in Java funciona de maneira semelhante. Depois de declarar nossoQueue, , swe pode adicionar novos elementos na parte de trás e removê-los da frente.

Na verdade, maneiramost Queues we’ll encounter in Java work in this first in, first out - freqüentemente abreviado para FIFO.

No entanto, há uma exceção que abordaremoslater.

3. Métodos principais

OQueue  declara umnumber of methods que precisa ser codificado por todas as classes de implementação. Let’s outline a few of the more importantones now:

  1. offer() - Insere um novo elemento emQueue

  2. *poll()* – remove um elemento da frente doQueue

  3. *peek()* – inspeciona o elemento na frente doQueue, em removê-lo

4. AbstractQueue

AbstractQueue is osimplest possible Queue implementation that Java provides. Inclui uma implementação esquelética de alguns dos métodos de sinterfaceQueue , excluindooffer.

When we create a custom queue estendendo o métodoAbstractQueue class _, we must provide an implementation of the _offer quenot permite a inserção de elementos nulos.

Além disso,we must provide the methods peek, poll, size, and java.util‘s iterator.

Let’s put together a simple Queue implementation usandoAbstractQueue.

Primeiro, vamos definir nossa classe com umLinkedList para armazenar nossasQueue’s eleções:

public class CustomexampleQueue extends AbstractQueue {

    private LinkedList elements;

    public CustomexampleQueue() {
      this.elements = new LinkedList();
    }

}

A seguir, vamosoverride the required methods and provide the code:

@Override
public Iterator iterator() {
    return elements.iterator();
}

@Override
public int size() {
    return elements.size();
}

@Override
public boolean offer(T t) {
    if(t == null) return false;
    elements.add(t);
    return true;
}

@Override
public T poll() {
    Iterator iter = elements.iterator();
    T t = iter.next();
    if(t != null){
        iter.remove();
        return t;
    }
    return null;
}

@Override
public T peek() {
    return elements.getFirst();
}

Excelente, vamos verificar se funciona com um teste de unidade rápido:

customQueue.add(7);
customQueue.add(5);

int first = customQueue.poll();
int second = customQueue.poll();

assertEquals(7, first);
assertEquals(5, second);

4. Subinterfaces

Geralmente, a sinterfaceQueue é herdada por3 main sub-interfaces.Blocking Queues, Transfer Queues eDeques.

Juntas, essas 3 interfaces são implementadas pela grande maioria dosQueues. disponíveis em Java. Vamos dar uma olhada rápida no que essas interfaces foram criadas para fazer.

4.1. Blocking Queues

OBlockingQueue interfacesupports additional operations which force threads to wait on the *Queue* dependendo do estado atual. Um thread podewait on the Queue to be non-empty when attempting a retrieval, or for it to become empty when adding um novo elemento.

Blocking Queues padrão incluiLinkedBlockingQueue, SynchronousQueue, areiaArrayBlockingQueue.

Para obter mais informações, consulte nosso artigo emBlocking Queues.

4.2. Transfer Queues

A sinterfaceTransferQueue estende a sinterfaceBlockingQueue , mas étailored toward the producer-consumer pattern. It controls the flow of information from producer to consumer, creating backpressure in the system.

Java vem com uma implementação da sinterfaceTransferQueue ,LinkedTransferQueue.

4.3. Deques

Deque é a abreviação deDouble -EndedQueue e é análogo a um baralho de cartas - os elementos podem ser obtidos tanto no início quanto no final doDeque . Muito parecido com oQueue, tradicional, oDeque provides methods to add, retrieve and peek at elements held at both the top and bottom.

Para obter um guia detalhado sobre comoDeque muda, verifique nossoArrayDeque https: //www.example.com/java-array-deque [artigo].

5. Priority Queues

Vimos anteriormente que a maioria dasQueues que encontramos em Java segue o princípio FIFO.

Uma dessas exceções a esta regra é oPriorityQueue. When new elements are inserted into the PriorityQueue, they are ordered based on their natural ordering, or by a defined Comparator fornecido quando construímos oPriorityQueue.

Vamos dar uma olhada em como isso funciona com um teste de unidade simples:

PriorityQueue integerQueue = new PriorityQueue<>();

integerQueue.add(9);
integerQueue.add(2);
integerQueue.add(4);

int first = integerQueue.poll();
int second = integerQueue.poll();
int third = integerQueue.poll();

assertEquals(2, first);
assertEquals(4, second);
assertEquals(9, third);

Apesar da ordem em que nossos inteiros foram adicionados aPriorityQueue, podemos ver quethe retrieval order is changed according to the natural order of the numbers.

Podemos ver que o mesmo também é verdadeiro quando aplicado aStrings:

PriorityQueue stringQueue = new PriorityQueue<>();

stringQueue.add("blueberry");
stringQueue.add("apple");
stringQueue.add("cherry");

String first = stringQueue.poll();
String second = stringQueue.poll();
String third = stringQueue.poll();

assertEquals("apple", first);
assertEquals("blueberry", second);
assertEquals("cherry", third);

6. Segurança da linha

Adicionar itens aQueues é particularmente útil em ambientes multithread. AQueue can be shared amongst threads, and be used to block progress until space is available - nos ajudandoovercome some common multi-threaded problems.

Por exemplo, gravar em um único disco a partir de vários encadeamentos cria contenção de recursos e pode levar a tempos de gravação lentos. Creating a single writer thread with a BlockingQueue can alleviate this issue and lead to vastly improved write speeds.

Felizmente, o Java ofereceConcurrentLinkedQueue, ArrayBlockingQueue eConcurrentLinkedDeque which são thread-safe e perfeitos para programas multi-threaded.

7. Conclusão

Neste tutorial, mergulhamos profundamente na sinterface JavaQueue .

Em primeiro lugar, nósexplored what a Queue does, bem como oimplementations that Java provides.

Em seguida, nóslooked at a Queue's usual FIFO principle, as well as the PriorityQueue which differs in its ordering.

Finalmente, nósexplored thread safety e comoQueues can pode ser usado em um ambiente multi-thread.

Como sempre, o código está disponívelover on GitHub.