Java LinkedBlockingQueue

Neste tutorial, aprenderemos sobre a classe LinkedBLockingQueue e seus métodos com a ajuda de exemplos.

A LinkedBlockingQueueclasse da Collectionsestrutura Java fornece a implementação da fila de bloqueio usando uma lista vinculada.

Ele implementa a interface Java BlockingQueue.

Criando LinkedBlockingQueue

Para criar uma fila de bloqueio vinculada, devemos importar o java.util.concurrent.LinkedBlockingQueuepacote.

Aqui está como podemos criar uma fila de bloqueio vinculada em Java:

1. Sem a capacidade inicial

 LinkedBlockingQueue animal = new LinkedBlockingQueue(); 

Aqui, a capacidade inicial padrão será 2 31 -1.

2. Com a capacidade inicial

 LinkedBlockingQueue animal = new LinkedBlockingQueue(int capacity); 

Aqui,

  • Tipo - o tipo da fila de bloqueio vinculada
  • capacidade - o tamanho da fila de bloqueio vinculada

Por exemplo,

 // Creating String type LinkedBlockingQueue with size 5 LinkedBlockingQueue animals = new LinkedBlockingQueue(5); // Creating Integer type LinkedBlockingQueue with size 5 LinkedBlockingQueue age = new LinkedBlockingQueue(5); 

Nota: Não é obrigatório fornecer o tamanho da lista vinculada.

Métodos de LinkedBlockingQueue

A LinkedBlockingQueueclasse fornece a implementação de todos os métodos na interface BlockingQueue.

Esses métodos são usados ​​para inserir, acessar e excluir elementos de filas de bloqueio vinculadas.

Além disso, aprenderemos sobre dois métodos put()e take()que suportam a operação de bloqueio na fila de bloqueio vinculada.

Esses dois métodos distinguem a fila de bloqueio vinculada de outras filas típicas.

Inserir Elementos

  • add()- Insere um elemento especificado na fila de bloqueio vinculada. Ele lança uma exceção se a fila estiver cheia.
  • offer()- Insere um elemento especificado na fila de bloqueio vinculada. Ele retorna falsese a fila estiver cheia.

Por exemplo,

 import java.util.concurrent.LinkedBlockingQueue; class Main ( public static void main(String() args) ( LinkedBlockingQueue animals = new LinkedBlockingQueue(5); // Using add() animals.add("Dog"); animals.add("Cat"); // Using offer() animals.offer("Horse"); System.out.println("LinkedBlockingQueue: " + animals); ) ) 

Resultado

 LinkedBlockingQueue: (cachorro, gato, cavalo) 

Elementos de Acesso

  • peek()- Retorna um elemento da frente da fila de bloqueio vinculada. Ele retorna nullse a fila estiver vazia.
  • iterator()- Retorna um objeto iterador para acessar sequencialmente um elemento da fila de bloqueio vinculada. Ele lança uma exceção se a fila estiver vazia. Devemos importar o java.util.Iteratorpacote para usá-lo.

Por exemplo,

 import java.util.concurrent.LinkedBlockingQueue; import java.util.Iterator; class Main ( public static void main(String() args) ( LinkedBlockingQueue animals = new LinkedBlockingQueue(5); // Add elements animals.add("Dog"); animals.add("Cat"); animals.add("Horse"); System.out.println("LinkedBlockingQueue: " + animals); // Using peek() String element = animals.peek(); System.out.println("Accessed Element: " + element); // Using iterator() Iterator iterate = animals.iterator(); System.out.print("LinkedBlockingQueue Elements: "); while(iterate.hasNext()) ( System.out.print(iterate.next()); System.out.print(", "); ) ) ) 

Resultado

 LinkedBlockingQueue: (Dog, Cat, Horse) Elemento acessado: Dog LinkedBlockingQueue Elements: Dog, Cat, Horse, 

Remover Elementos

  • remove()- Retorna e remove um elemento especificado da fila de bloqueio vinculada. Ele lança uma exceção se a fila estiver vazia.
  • poll()- Retorna e remove um elemento especificado da fila de bloqueio vinculada. Ele retorna nullse a fila estiver vazia.
  • clear() - Remove todos os elementos da fila de bloqueio vinculada.

Por exemplo,

 import java.util.concurrent.LinkedBlockingQueue; class Main ( public static void main(String() args) ( LinkedBlockingQueue animals = new LinkedBlockingQueue(5); animals.add("Dog"); animals.add("Cat"); animals.add("Horse"); System.out.println("LinkedBlockingQueue " + animals); // Using remove() String element1 = animals.remove(); System.out.println("Removed Element:"); System.out.println("Using remove(): " + element1); // Using poll() String element2 = animals.poll(); System.out.println("Using poll(): " + element2); // Using clear() animals.clear(); System.out.println("Updated LinkedBlockingQueue " + animals); ) ) 

Resultado

 LinkedBlockingQueue: (Dog, Cat, Horse) Elementos removidos: Usando remove (): Cachorro Usando poll (): Cat Atualizado LinkedBlockingQueue: () 

Métodos put () e take ()

Em processos multithreading, podemos usar put()e take()para bloquear a operação de um thread para sincronizá-lo com outro thread. Esses métodos irão esperar até que possam ser executados com sucesso.

Método put ()

Para inserir o elemento especificado no final de uma fila de bloqueio vinculada, usamos o put()método.

Se a fila de bloqueio vinculada estiver cheia, ele espera até que haja espaço na fila de bloqueio vinculada para inserir o elemento.

Por exemplo,

 import java.util.concurrent.LinkedBlockingQueue; class Main ( public static void main(String() args) ( LinkedBlockingQueue animals = new LinkedBlockingQueue(5); try ( // Add elements to animals animals.put("Dog"); animals.put("Cat"); System.out.println("LinkedBlockingQueue: " + animals); ) catch(Exception e) ( System.out.println(e); ) ) ) 

Resultado

 LinkedBlockingQueue: (cachorro, gato) 

Aqui, o put()método pode lançar um InterruptedExceptionse for interrompido durante a espera. Portanto, devemos colocá-lo dentro de um bloco try… catch.

Método take ()

Para retornar e remover um elemento da frente da fila de bloqueio vinculada, podemos usar o take()método.

Se a fila de bloqueio vinculada estiver vazia, ela espera até que haja elementos na fila de bloqueio vinculada para serem excluídos.

Por exemplo,

 import java.util.concurrent.LinkedBlockingQueue; class Main ( public static void main(String() args) ( LinkedBlockingQueue animals = new LinkedBlockingQueue(5); try ( //Add elements to animals animals.put("Dog"); animals.put("Cat"); System.out.println("LinkedBlockingQueue: " + animals); // Remove an element String element = animals.take(); System.out.println("Removed Element: " + element); System.out.println("New LinkedBlockingQueue: " + animals); ) catch(Exception e) ( System.out.println(e); ) ) ) 

Resultado

 LinkedBlockingQueue: (Cachorro, Gato) Elemento removido: Cachorro Novo LinkedBlockingQueue: (Gato) 

Aqui, o take()método lançará um InterrupedExceptionse for interrompido durante a espera. Portanto, devemos colocá-lo dentro de um try… catchbloco.

Outros métodos

Métodos Descrições
contains(element) Pesquisa a fila de bloqueio vinculada para o elemento especificado. Se o elemento for encontrado, ele retorna true, caso contrário, ele retorna false.
size() Retorna o comprimento da fila de bloqueio vinculada.
toArray() Converte a fila de bloqueio vinculada em uma matriz e retorna a matriz.
toString() Converte a fila de bloqueio vinculada em string

Por que usar LinkedBlockingQueue?

O LinkedBlockingQueueusa listas vinculadas como seu armazenamento interno.

É considerada uma coleção thread-safe . Por isso, é geralmente usado em aplicações multi-threading.

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

Agora, se o primeiro encadeamento for mais lento que o segundo encadeamento, a fila de bloqueio vinculada pode fazer com que o segundo encadeamento espere até que o primeiro encerre suas operações.

Artigos interessantes...