Interface Java BlockingQueue

Neste tutorial, aprenderemos sobre a interface Java BlockingQueue e seus métodos.

A BlockingQueueinterface da Collectionsestrutura Java estende a Queueinterface. Ele permite que qualquer operação espere até que possa ser executada com sucesso.

Por exemplo, se quisermos excluir um elemento de uma fila vazia, a fila de bloqueio permite que a operação de exclusão espere até que a fila contenha alguns elementos a serem excluídos.

Classes que implementam BlockingQueue

Como BlockingQueueé uma interface, não podemos fornecer a implementação direta dela.

Para usar a funcionalidade do BlockingQueue, precisamos usar classes que o implementam.

  • ArrayBlockingQueue
  • LinkedBlockingQueue

Como usar o bloqueio de filas?

Devemos importar o java.util.concurrent.BlockingQueuepacote para podermos usar BlockingQueue.

 // Array implementation of BlockingQueue BlockingQueue animal1 = new ArraryBlockingQueue(); // LinkedList implementation of BlockingQueue BlockingQueue animal2 = new LinkedBlockingQueue(); 

Aqui, criamos os objetos animal1 e animal2 de classes ArrayBlockingQueuee LinkedBlockingQueue, respectivamente. Esses objetos podem usar as funcionalidades da BlockingQueueinterface.

Métodos de BlockingQueue

Com base no fato de uma fila estar cheia ou vazia, os métodos de uma fila de bloqueio podem ser divididos em 3 categorias:

Métodos que lançam uma exceção

  • add()- Insere um elemento na fila de bloqueio no final da fila. Lança uma exceção se a fila estiver cheia.
  • element()- Retorna a cabeça da fila de bloqueio. Lança uma exceção se a fila estiver vazia.
  • remove()- Remove um elemento da fila de bloqueio. Lança uma exceção se a fila estiver vazia.

Métodos que retornam algum valor

  • offer()- Insere o elemento especificado na fila de bloqueio no final da fila. Retorna falsese a fila estiver cheia.
  • peek()- Retorna a cabeça da fila de bloqueio. Retorna nullse a fila estiver vazia.
  • poll()- Remove um elemento da fila de bloqueio. Retorna nullse a fila estiver vazia.

Mais em oferta () e enquete ()

O método offer()e poll()pode ser usado com tempos limite. Ou seja, podemos passar unidades de tempo como parâmetro. Por exemplo,

 offer(value, 100, milliseconds) 

Aqui,

  • valor é o elemento a ser inserido na fila
  • E definimos um tempo limite de 100 milissegundos

Isso significa que o offer()método tentará inserir um elemento na fila de bloqueio por 100milissegundos. Se o elemento não puder ser inserido em 100 milissegundos, o método retornará false.

Nota: Em vez de milliseconds, também podemos usar essas unidades de tempo: days, hours, minutes, seconds, microsecondse nanosecondsno offer()e poll()métodos.

Métodos que bloqueiam a operação

O BlockingQueuetambém fornece métodos para bloquear as operações e aguardar se a fila estiver cheia ou vazia.

  • put()- Insere um elemento na fila de bloqueio. Se a fila estiver cheia, ele aguardará até que a fila tenha espaço para inserir um elemento.
  • take()- Remove e retorna um elemento da fila de bloqueio. Se a fila estiver vazia, ele aguardará até que a fila tenha elementos a serem excluídos.

Suponha que desejamos inserir elementos em uma fila. Se a fila estiver cheia, o put()método aguardará até que a fila tenha espaço para inserir elementos.

Da mesma forma, se quisermos excluir elementos de uma fila. Se a fila estiver vazia, o take()método aguardará até que a fila contenha elementos a serem excluídos.

Implementação de BlockingQueue em ArrayBlockingQueue

 import java.util.concurrent.BlockingQueue; import java.util.concurrent.ArrayBlockingQueue; class Main ( public static void main(String() args) ( // Create a blocking queue using the ArrayBlockingQueue BlockingQueue numbers = new ArrayBlockingQueue(5); try ( // Insert element to blocking queue numbers.put(2); numbers.put(1); numbers.put(3); System.out.println("BLockingQueue: " + numbers); // Remove Elements from blocking queue int removedNumber = numbers.take(); System.out.println("Removed Number: " + removedNumber); ) catch(Exception e) ( e.getStackTrace(); ) ) ) 

Resultado

 BlockingQueue: (2, 1, 3) Elemento removido: 2 

Para saber mais sobre ArrayBlockingQueue, visite Java ArrayBlockingQueue.

Por que BlockingQueue?

Em Java, BlockingQueueé considerada a coleção thread-safe . É porque pode ser útil em operações multithreading.

Suponha que um thread esteja inserindo elementos na fila e outro thread esteja removendo elementos da fila.

Agora, se o primeiro encadeamento for executado mais lentamente, a fila de bloqueio pode fazer o segundo encadeamento esperar até que o primeiro encadeamento conclua sua operação.

Artigos interessantes...