Neste tutorial, aprenderemos sobre a classe LinkedBLockingQueue e seus métodos com a ajuda de exemplos.
A LinkedBlockingQueue
classe da Collections
estrutura 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.LinkedBlockingQueue
pacote.
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 LinkedBlockingQueue
classe 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 retornafalse
se 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 retornanull
se 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 ojava.util.Iterator
pacote 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 retornanull
se 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 InterruptedException
se 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 InterrupedException
se for interrompido durante a espera. Portanto, devemos colocá-lo dentro de um try… catch
bloco.
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 LinkedBlockingQueue
usa 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.