Dominando Java LinkedBlockingQueue: Guia Completo e Exemplos
Java LinkedBlockingQueue
Explore a classe LinkedBlockingQueue, seus métodos principais e exemplos do mundo real para desbloquear filas thread-safe no Java.
A classe LinkedBlockingQueue, parte do pacote java.util.concurrent do Java, implementa uma fila de bloqueio apoiada por uma lista encadeada. Ela conforma à interface BlockingQueue, fornecendo uma estrutura robusta e thread-safe para cenários concorrentes de produtor-consumidor.
Criando um LinkedBlockingQueue
Para usar esta fila, importe java.util.concurrent.LinkedBlockingQueue:
import java.util.concurrent.LinkedBlockingQueue;
1. Sem Capacidade Inicial
LinkedBlockingQueue<Tipo> fila = new LinkedBlockingQueue<>();
A capacidade padrão é Integer.MAX_VALUE (231–1), tornando a fila efetivamente ilimitada.
2. Com Capacidade Especificada
LinkedBlockingQueue<Tipo> fila = new LinkedBlockingQueue<>(int capacidade);
Tipo– o tipo de elemento (ex:String,Integer)capacidade– número máximo de elementos que a fila pode conter
Exemplo:
// Fila de strings com capacidade 5
LinkedBlockingQueue<String> animais = new LinkedBlockingQueue<>(5);
// Fila de inteiros com capacidade 5
LinkedBlockingQueue<Integer> idades = new LinkedBlockingQueue<>(5);
Nota: Capacidade é opcional; omiti-la cria uma fila ilimitada.
Métodos Principais do LinkedBlockingQueue
A classe implementa todos os métodos de BlockingQueue, permitindo inserção, recuperação e remoção de elementos. Dois métodos — put() e take() — fornecem comportamento de bloqueio que distingue esta fila das padrão.
Inserir Elementos
add(E e)– Adiciona um elemento, lançando exceção se a fila estiver cheia.offer(E e)– Adiciona um elemento, retornandofalsese a fila estiver cheia.
Exemplo:
import java.util.concurrent.LinkedBlockingQueue;
public class Main {
public static void main(String[] args) {
LinkedBlockingQueue<String> animais = new LinkedBlockingQueue<>(5);
animais.add("Cachorro");
animais.add("Gato");
animais.offer("Cavalo");
System.out.println("LinkedBlockingQueue: " + animais);
}
}
Saída
LinkedBlockingQueue: [Cachorro, Gato, Cavalo]
Acessar Elementos
peek()– Recupera, mas não remove, o elemento do cabeça; retornanullse vazia.iterator()– Fornece um iterador fail-safe sobre a fila. Importejava.util.Iteratorpara usá-lo.
Exemplo:
import java.util.concurrent.LinkedBlockingQueue;
import java.util.Iterator;
public class Main {
public static void main(String[] args) {
LinkedBlockingQueue<String> animais = new LinkedBlockingQueue<>(5);
animais.add("Cachorro");
animais.add("Gato");
animais.add("Cavalo");
System.out.println("LinkedBlockingQueue: " + animais);
String cabeca = animais.peek();
System.out.println("Elemento Acessado: " + cabeca);
Iterator<String> it = animais.iterator();
System.out.print("Elementos do LinkedBlockingQueue: ");
while (it.hasNext()) {
System.out.print(it.next() + ", ");
}
}
}
Saída
LinkedBlockingQueue: [Cachorro, Gato, Cavalo] Elemento Acessado: Cachorro Elementos do LinkedBlockingQueue: Cachorro, Gato, Cavalo,
Remover Elementos
remove()– Remove e retorna o cabeça; lança exceção se vazia.poll()– Remove e retorna o cabeça; retornanullse vazia.clear()– Elimina todos os elementos.
Exemplo:
import java.util.concurrent.LinkedBlockingQueue;
public class Main {
public static void main(String[] args) {
LinkedBlockingQueue<String> animais = new LinkedBlockingQueue<>(5);
animais.add("Cachorro");
animais.add("Gato");
animais.add("Cavalo");
System.out.println("LinkedBlockingQueue: " + animais);
String removido = animais.remove();
System.out.println("Usando remove(): " + removido);
String polled = animais.poll();
System.out.println("Usando poll(): " + polled);
animais.clear();
System.out.println("LinkedBlockingQueue Atualizado: " + animais);
}
}
Saída
LinkedBlockingQueue: [Cachorro, Gato, Cavalo] Usando remove(): Cachorro Usando poll(): Gato LinkedBlockingQueue Atualizado: []
Operações de Bloqueio: put() & take()
Em contextos concorrentes, put() e take() bloqueiam a thread chamadora até que a operação possa prosseguir, garantindo coordenação segura entre produtores e consumidores.
put()
Insere um elemento na cauda, esperando se a fila estiver cheia.
Exemplo:
import java.util.concurrent.LinkedBlockingQueue;
public class Main {
public static void main(String[] args) {
LinkedBlockingQueue<String> animais = new LinkedBlockingQueue<>(5);
try {
animais.put("Cachorro");
animais.put("Gato");
System.out.println("LinkedBlockingQueue: " + animais);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
System.err.println(e.getMessage());
}
}
}
Saída
LinkedBlockingQueue: [Cachorro, Gato]
take()
Recupera e remove o elemento do cabeça, bloqueando se a fila estiver vazia.
Exemplo:
import java.util.concurrent.LinkedBlockingQueue;
public class Main {
public static void main(String[] args) {
LinkedBlockingQueue<String> animais = new LinkedBlockingQueue<>(5);
try {
animais.put("Cachorro");
animais.put("Gato");
System.out.println("LinkedBlockingQueue: " + animais);
String removido = animais.take();
System.out.println("Elemento Removido: " + removido);
System.out.println("Novo LinkedBlockingQueue: " + animais);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
System.err.println(e.getMessage());
}
}
}
Saída
LinkedBlockingQueue: [Cachorro, Gato] Elemento Removido: Cachorro Novo LinkedBlockingQueue: [Gato]
Métodos Utilitários Adicionais
| Método | Descrição |
|---|---|
contains(Object o) | Verifica se a fila contém o elemento especificado. |
size() | Retorna o número atual de elementos. |
toArray() | Converte a fila para um array. |
toString() | Fornece uma representação em string da fila. |
Por Que Escolher LinkedBlockingQueue?
Como usa uma lista encadeada internamente, LinkedBlockingQueue oferece:
- Thread-safety pronto para uso.
- Capacidade limitada opcional para controle de back-pressure.
- Métodos de bloqueio que coordenam naturalmente produtores e consumidores.
Em aplicações multi-thread onde uma thread pode produzir mais devagar que outra consome, a fila suspenderá automaticamente o consumidor até que novos itens cheguem, prevenindo busy-waiting e reduzindo overhead de CPU.
Para cargas de trabalho concorrentes de alto desempenho, a API de concorrência do Java recomenda LinkedBlockingQueue como estrutura preferida para pipelines produtor-consumidor.
Java
- Dominando Operadores Java: Tipos, Sintaxe e Exemplos Práticos
- Comentários em Java: Tipos, Uso e Boas Práticas
- Dominando o Loop for Aprimorado em Java: Sintaxe, Exemplos e Boas Práticas
- Dominando Strings em Java: Criação, Métodos e Boas Práticas
- Dominando Interfaces em Java: Conceitos, Implementação e Boas Práticas
- Dominando Classes Internas Anônimas em Java: Definição, Sintaxe e Exemplos Práticos
- Dominando Try-With-Resources em Java: Gerenciamento Automático de Recursos Explicado
- Anotações em Java Explicadas: Tipos, Posicionamento e Exemplos Práticos
- Asserções em Java: Guia Prático para Detectar Bugs e Garantir Confiabilidade do Código
- Entendendo o Java Vector: Uso, Recursos e Comparação com ArrayList