Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Industrial programming >> Java

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);

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

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

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

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étodoDescriçã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:

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

  1. Dominando Operadores Java: Tipos, Sintaxe e Exemplos Práticos
  2. Comentários em Java: Tipos, Uso e Boas Práticas
  3. Dominando o Loop for Aprimorado em Java: Sintaxe, Exemplos e Boas Práticas
  4. Dominando Strings em Java: Criação, Métodos e Boas Práticas
  5. Dominando Interfaces em Java: Conceitos, Implementação e Boas Práticas
  6. Dominando Classes Internas Anônimas em Java: Definição, Sintaxe e Exemplos Práticos
  7. Dominando Try-With-Resources em Java: Gerenciamento Automático de Recursos Explicado
  8. Anotações em Java Explicadas: Tipos, Posicionamento e Exemplos Práticos
  9. Asserções em Java: Guia Prático para Detectar Bugs e Garantir Confiabilidade do Código
  10. Entendendo o Java Vector: Uso, Recursos e Comparação com ArrayList