Java ArrayBlockingQueue: Guia Avançado de Filas de Bloqueio e Operações Thread-Safe
Java ArrayBlockingQueue
Explore o Java ArrayBlockingQueue – aprenda como criar, manipular e usar thread-safely esta fila de bloqueio de tamanho fixo com exemplos claros.
A classe ArrayBlockingQueue no Java Collections Framework fornece uma fila limitada, thread-safe, apoiada por um array. Ela implementa a interface BlockingQueue, permitindo que produtores e consumidores coordenem via operações de bloqueio.
Criando um ArrayBlockingQueue
Importe java.util.concurrent.ArrayBlockingQueue e instancie com uma capacidade fixa:
ArrayBlockingQueue<Tipo> fila = new ArrayBlockingQueue<>(capacidade);
Onde Tipo é o tipo de elemento e capacidade é o tamanho máximo.
- Exemplo – Fila de strings tamanho 5:
ArrayBlockingQueue<String> animais = new ArrayBlockingQueue<>(5); - Exemplo – Fila de inteiros tamanho 5:
ArrayBlockingQueue<Integer> idades = new ArrayBlockingQueue<>(5);
Nota: Capacidade é obrigatória; determina o tamanho limitado da fila.
Métodos Principais do ArrayBlockingQueue
A classe implementa todos os métodos de BlockingQueue para inserir, acessar e remover elementos. Abaixo estão as operações mais usadas.
Inserir Elementos
add(E e)– Adiciona o elemento; lançaIllegalStateExceptionse cheia.offer(E e)– Adiciona o elemento; retornafalsese cheia.
ArrayBlockingQueue<String> animais = new ArrayBlockingQueue<>(5);
animais.add("Cachorro");
animais.offer("Gato");
animais.offer("Cavalo");
System.out.println("ArrayBlockingQueue: " + animais);
Saída: ArrayBlockingQueue: [Cachorro, Gato, Cavalo]
Acessar Elementos
peek()– Recupera o cabeça sem remoção; retornanullse vazia.iterator()– Fornece um iterador fail-fast sobre a fila.
String cabeca = animais.peek();
System.out.println("Elemento da cabeça: " + cabeca);
Iterator<String> it = animais.iterator();
while (it.hasNext()) {
System.out.print(it.next() + ", ");
}
Saída: Elemento da cabeça: Cachorro seguido da lista de elementos.
Remover Elementos
remove()– Remove e retorna o cabeça; lançaNoSuchElementExceptionse vazia.poll()– Remove e retorna o cabeça; retornanullse vazia.clear()– Esvazia a fila.
String removido1 = animais.remove();
String removido2 = animais.poll();
animais.clear();
System.out.println("Fila atualizada: " + animais);
Saída: Fila atualizada: []
Operações de Bloqueio: put() e take()
Esses métodos são essenciais para padrões produtor-consumidor. Eles bloqueiam até que a operação possa ser realizada, garantindo coordenação de threads.
put()
Insere um elemento, esperando se a fila estiver cheia. Pode lançar InterruptedException.
try {
animais.put("Cachorro");
animais.put("Gato");
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
take()
Remove e retorna o cabeça, esperando se a fila estiver vazia. Pode lançar InterruptedException.
try {
String elemento = animais.take();
System.out.println("Removido: " + elemento);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
Métodos de Conveniência Adicionais
| Método | Descrição |
|---|---|
contains(Object o) | Retorna true se a fila contém o elemento especificado. |
size() | Retorna o número atual de elementos. |
toArray() | Converte a fila para um array. |
toString() | Representação em string da fila. |
Por Que Usar ArrayBlockingQueue?
Porque oferece:
- Thread safety: Sincronização embutida para acesso concorrente.
- Tamanho fixo: Previne crescimento descontrolado de memória.
- Semântica de bloqueio: Simplifica coordenação produtor-consumidor.
Quando uma thread produz mais devagar que o consumidor, o consumidor bloqueia automaticamente, evitando busy-waiting e garantindo uso eficiente de CPU.
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