English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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.
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.
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.
De acordo com se a fila está cheia ou vazia, os métodos da fila de bloqueio podem ser divididos em3Classe:
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.
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.
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.
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.
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.