O que é BlockingQueue em Java e como implementá-lo?



Este artigo sobre BlockingQueue em Java o ajudará a aprender sobre a interface BlockingQueue. Também lhe dará uma visão sobre seus métodos e implementação prática

é extremamente popular entre os programadores por causa de sua ampla gama de recursos integrados. Na maioria das vezes, você terá uma solução dedicada para o seu problema antes mesmo que ele apareça. Uma parte extremamente útil e importante de é a interface BlockingQueue em Java. Por meio deste artigo, vou lançar alguma luz sobre BlockingQueue em Java e os métodos para implementá-lo.

Abaixo estão os tópicos abordados neste artigo:





Interface BlockingQueue em Java

BlockingQueue em Java é uma interface que foi adicionada em Java 1.5 junto com algumas outras classes de Utilitários concorrentes, como ConcurrentHashMap, CopyOnWriteArrrayList, etc. A interface BlockingQueue pertence ao java.util.concurrent pacote .Essa interface aprimora o controle de fluxo ativando o bloqueio, caso um thread esteja tentando desenfileirar uma fila vazia ou enfileirar uma fila cheia. Em ambos os casos, essa interface é útil.Em termos mais simples, suponha que um está tentando adicionar elementos a uma fila já cheia. Nesse ponto do programa, BlockingQueue será invocado, o que bloqueará aquele thread em particular até que outro thread libere a fila para liberar espaço. Isso pode ser o resultado da remoção da fila de um (s) elemento (s) ou da liberação de toda a fila. Da mesma forma, BlockingQueue será invocado para bloquear um thread tentando desenfileirar uma fila já vazia até que algum outro thread seja inserido ou adicione um elemento ao vazio fila .

Ao trabalhar com a interface BlockingQueue em Java, você deve se lembrar que ela não aceita um valor nulo. Caso você tente fazer isso, ele lançará instantaneamente um NullPointerException. A figura abaixo representa o funcionamento da interface BlockingQueue em Java.



BlockingQueue - BlockingQueue em Java - Edurekaeste interface é usado principalmente entre produtor-consumidores, pois é Thread-Safe.O que quero dizer é que a interface BlockingQueue pode ser usada para criar uma fila que pode ser compartilhada tanto pelo produtor quanto pelo consumidor

Para trabalhar com BlockingQueue em Java, primeiro você precisa se familiarizar com seus tipos. Deixe-me apresentá-los na próxima seção deste artigo.

como encontrar o comprimento do array em javascript

Tipos de construtores para BlockingQueue em Java

Existem dois tipos de construtores para a interface BlockingQueue em Java:



  • Fila não limitada: Para este tipo de fila, a capacidade será definida como Integer.MAX_VALUE. Uma fila ilimitada nunca será bloqueada, pois pode crescer dinamicamente, cada vez que um elemento é inserido nela. Abaixo está a sintaxe para criar uma fila ilimitada:
BlockingQueue bq = new LinkedBlockingDeque ()
  • Fila limitada: Para este tipo de fila, você precisa passar a capacidade da fila no momento de sua criação, ou seja, como um construtor parâmetro. Depois que o tamanho é atribuído, ele não pode ser alterado. Abaixo está a sintaxe para criar uma fila limitada:
BlockingQueue bq = new LinkedBlockingDeque (10)

Agora que você está familiarizado com as maneiras de implementar BlockingQueue em Java, deixe-me listar alguns de seus métodos.

Métodos na interface BlockingQueue

Método Descrição
adição booleana (E e) Este método ajuda a inserir o elemento especificado nesta fila se houver espaço na fila, caso contrário ele irájogue umIllegalStateException
boolean contém (objeto o) Este método retorna verdadeiro se a fila contém o elemento especificado
int DrainTo (Coleção c) Este método irá remover todos os elementos disponíveis da fila e adicioná-los à coleção especificada
int DrainTo (Coleção c, int maxElements) Este método irá remover um determinado número de elementos disponíveis da fila e adicioná-los ao especificado
oferta booleana (E e) Este método irá inserir o elemento especificado na fila se não estiver cheio e retornar verdadeiro, caso contrário, retornará falso
oferta booleana (E e, tempo limite longo, unidade TimeUnit) Este método irá inserir o elemento especificado na fila. Caso a fila esteja cheia, ela aguardará o tempo de espera especificado para que o espaço fique disponível.
E poll (longo tempo limite, unidade TimeUnit) Este método ajuda a recuperar e remover o início da fila. Caso a fila esteja vazia, ele aguardará até o tempo de espera especificado para que um elemento fique disponível
void put (E e) Este método irá inserir o elemento especificado na fila, esperando que o espaço fique disponível caso a fila esteja cheia
int restanteCapacidade () Este método ajuda a retornar o número de elementos adicionais que esta fila pode aceitar idealmente sem ser bloqueada
boolean remove (objeto o) Este método irá remover uma única instância do elemento especificado da fila apenas se estiver presente
E take () Este método ajudará a recuperar e remover o cabeçalho da fila, esperando que um elemento fique disponível, caso a fila esteja vazia.

Implementações BlockingQueue

Aqui, implementarei um exemplo simples de BlockingQueue em Java, ondeclasse EduProducer irá gerar os dados e inseri-los em um fila , simultaneamente, outra classe, EduConsumer irá remover os dados da mesma fila.

classe __init__ python

Para isso estarei criando 3 classes a saber:

  1. EduProducer
  2. EduConsumer
  3. EdurekaMain

Vamos agora criar cada uma dessas classes, uma por uma.

EduProducer.java

pacote edureka import java.util.concurrent.BlockingQueue public class EduProducer implementa Runnable {private final BlockingQueue queue @Override public void run () {try {process ()} catch (InterruptedException e) {Thread.currentThread (). interrupt ()} } private void process () throws InterruptedException {// Coloque 10 ints na fila para (int i = 0 i<10 i++) { System.out.println('[Producer] Add : ' + i) queue.put(i) System.out.println('[Producer] Queue's Remaining Capacity : ' + queue.remainingCapacity()) Thread.sleep(150) } } public EduProducer(BlockingQueue queue) { this.queue = queue } }

EduConsumer.java

pacote edureka import java.util.concurrent.BlockingQueue public class EduConsumer implementa Runnable {private final BlockingQueue queue @Override public void run () {try {while (true) {Integer take = queue.take () process (take)}} catch (InterruptedException e) {Thread.currentThread (). Interrupt ()}} processo void privado (Integer take) lança InterruptedException {System.out.println ('[Consumer] Remove:' + take) Thread.sleep (500)} public EduConsumer (fila BlockingQueue) {this.queue = queue}}

EdurekaMain.java

pacote edureka import java.util.concurrent.BlockingQueue import java.util.concurrent.LinkedBlockingQueue public class EdurekaMain {public static void main (String [] args) {BlockingQueue queue = new LinkedBlockingQueue (10) new Thread (novo EduProducer (fila)) .start () new Thread (new EduConsumer (queue)). start ()}}

Quando terminar de escrever o código, execute o programa para obter o resultado abaixo:

algoritmo fibonacci c ++
[Produtor] Adicionar: 0 [Consumidor] Obter: 0 [Produtor] Capacidade Remanescente da Fila: 9 [Produtor] Adicionar: 1 [Produtor] Capacidade Remanescente da Fila: 9 [Produtor] Adicionar: 2 [Produtor] Capacidade Restante da Fila: 8 [Produtor ] Adicionar: 3 [Produtor] Capacidade Remanescente da Fila: 7 [Consumidor] Assumir: 1 [Produtor] Adicionar: 4 [Produtor] Capacidade Restante da Fila: 7 [Produtor] Adicionar: 5 [Produtor] Capacidade Restante da Fila: 6 [Produtor] Adicionar : 6 [Produtor] Capacidade Remanescente da Fila: 5 [Consumidor] Tomada: 2 [Produtor] Adicionar: 7 [Produtor] Capacidade Restante da Fila: 5 [Produtor] Adicionar: 8 [Produtor] Capacidade Restante da Fila: 4 [Produtor] Adicionar: 9 Capacidade restante da fila do [produtor]: 3 [Consumidor] Take: 3 [Consumidor] Take: 4 [Consumidor] Take: 5 [Consumidor] Take: 6 [Consumidor] Take: 7 [Consumidor] Take: 8 [Consumidor] Take: 9

Isso nos leva ao final deste artigo sobre BlockingQueue em Java. Se você deseja aprender Java com mais detalhes, consulte nosso também.

Agora que você entendeu os fundamentos do BlockingQueue em Java, verifique o pela Edureka, uma empresa de aprendizagem online confiável com uma rede de mais de 250.000 alunos satisfeitos espalhados por todo o mundo. O curso de certificação e treinamento em Java J2EE e SOA da Edureka é projetado para estudantes e profissionais que desejam ser um desenvolvedor Java. O curso foi desenvolvido para dar a você uma vantagem inicial na programação Java e treiná-lo para os conceitos básicos e avançados de Java, juntamente com vários frameworks Java como Hibernate e Spring.

Tem alguma questão para nós? Mencione isso na seção de comentários deste “BlockingQueue em Java” e entraremos em contato com você o mais breve possível.