English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutorial Básico de Java

Java controle de fluxo

Java array

Java orientado a objetos (I)

Java orientado a objetos (II)

Java orientado a objetos (III)

Tratamento de Exceções Java

Java Lista (List)

Java Queue (fila)

conjunto Map do Java

conjunto Set do Java

Java Input/Output (I)/O)

Java Reader/Writer

Outros tópicos do Java

Java BlockingQueue

Neste tutorial, vamos aprender sobre a interface Java BlockingQueue e seus métodos.

A interface BlockingQueue do framework Java Collections expande a interface Queue. Permite que qualquer operação aguarde até que seja executada com sucesso.

Por exemplo, se quisermos remover elementos de uma fila vazia, a fila de bloqueio permite que a operação de remoção aguarde até que a fila contenha alguns elementos a serem removidos.

Classes que implementam BlockingQueue

Como BlockingQueue é uma interface, não podemos fornecer sua implementação direta.

Para usar as funcionalidades da BlockingQueue, precisamos usar a classe que a implementa.

Como usar a fila de bloqueio?

Precisamos importar o pacote java.util.concurrent.BlockingQueue para usar BlockingQueue.

//Implementação Array da BlockingQueue
BlockingQueue<String> animal1 = new ArraryBlockingQueue<>();
//Implementação LinkedList da BlockingQueue
BlockingQueue<String> animal2 = new LinkedBlockingQueue<>();

Aqui, criamos os objetos animal das classes ArrayBlockingQueue e LinkedBlockingQueue, respectivamente1e animal2. Esses objetos podem usar as funcionalidades da interface BlockingQueue.

Métodos da BlockingQueue

De acordo com se a fila está cheia ou vazia, os métodos da fila de bloqueio podem ser divididos em3Classe:

Método que gera exceção

  • add() - Insira o elemento no final da fila de bloqueio. Se a fila estiver cheia, lança uma exceção.

  • element() - Retorna a cabeça da fila de bloqueio. Se a fila estiver vazia, lança uma exceção.

  • remove() -Remove um elemento da fila de bloqueio. Se a fila estiver vazia, lança uma exceção.

Método para retornar um valor

  • offer() - Insira o elemento especificado no final da fila de bloqueio. Se a fila estiver cheia, retorna false.

  • peek() - Retorna a cabeça da fila de bloqueio. Se a fila estiver vazia, retorna null.

  • poll() - Remove um elemento da fila de bloqueio. Se a fila estiver vazia, retorna null.

offer() e poll()Mais conteúdo

offer() e poll() métodos podem ser usados com timeout. Isso significa que podemos passar unidades de tempo como parâmetros. Por exemplo,

offer(value, 100, milliseconds)

Aqui,

  • value é o elemento a ser inserido na fila

  • e configuraremos o tempo de espera para100 milissegundos

Isso significa que o método offer() tentará inserir um elemento na fila de bloqueio, por100 milissegundos. Se10Não é possível inserir elementos dentro de 0 milissegundos, o método retornará false.

Nota:Além dos milissegundos, também podemos usar os seguintes unidades de tempo nos métodos offer() e poll(): dias, horas, minutos, segundos, microsegundos e nanosegundos.

Métodos de operação de BlockingQueue

BlockingQueue também fornece alguns métodos para operações de bloqueio e espera, se a fila estiver cheia ou vazia.

  • put() - Inserir um elemento na fila de bloqueio. Se a fila estiver cheia, ela ficará em espera até haver espaço para inserir o elemento.

  • take() - Remover e retornar um elemento da fila de bloqueio. Se a fila estiver vazia, ela ficará em espera até haver um elemento a ser removido na fila.

Supondo que queiramos inserir elementos na fila. Se a fila estiver cheia, o método put() ficará em espera até a fila ter espaço para inserir o elemento.

Da mesma forma, se quisermos remover elementos da fila. Se a fila estiver vazia, o método take() ficará em espera até a fila conter o elemento a ser removido.

Implementação de BlockingQueue no ArrayBlockingQueue

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ArrayBlockingQueue;
class Main {
    public static void main(String[] args) {
      //Criar uma fila de bloqueio usando ArrayBlockingQueue
      BlockingQueue<Integer> numbers = new ArrayBlockingQueue<>(5);
      try {
        //Inserir elemento em uma fila de bloqueio
        numbers.put(2);
        numbers.put(1);
        numbers.put(3);
        System.out.println("Fila de Bloqueio: " + numbers);
        //Remover elemento de uma fila de bloqueio
        int removedNumber = numbers.take();
        System.out.println("Número removido: ")} + removedNumber);
      }
      catch(Exception e) {
          e.getStackTrace();
      }
    }
}

Resultados de saída

BlockingQueue: [2, 1, 3]
Elemento removido: 2

Para obter mais informações sobre ArrayBlockingQueue, acesseJava ArrayBlockingQueue.

Por que escolher BlockingQueue?

No Java, BlockingQueue é vista comoThread-safeConjunto. Isso porque pode ajudar em operações multithread.

Suponha que uma thread esteja inserindo elementos na fila e outra thread esteja removendo elementos da fila.

Agora, se a velocidade de execução da primeira thread for mais lenta, a fila de bloqueio pode fazer a segunda thread esperar até que a primeira thread complete sua operação.