Neste tutorial, aprenderemos sobre a classe ArrayBlockingQueue e seus métodos com a ajuda de exemplos.
A ArrayBlockingQueue
classe do framework Java Collections fornece a implementação da fila de bloqueio usando um array.
Ele implementa a interface Java BlockingQueue.
Criando ArrayBlockingQueue
Para criar uma fila de bloqueio de array, devemos importar o java.util.concurrent.ArrayBlockingQueue
pacote.
Depois de importar o pacote, aqui está como podemos criar uma fila de bloqueio de array em Java:
ArrayBlockingQueue animal = new ArrayBlockingQueue(int capacity);
Aqui,
- Tipo - o tipo de fila de bloqueio de array
- capacidade - o tamanho da fila de bloqueio de array
Por exemplo,
// Creating String type ArrayBlockingQueue with size 5 ArrayBlockingQueue animals = new ArrayBlockingQueue(5); // Creating Integer type ArrayBlockingQueue with size 5 ArrayBlockingQueue age = new ArrayBlockingQueue(5);
Nota: É obrigatório fornecer o tamanho do array.
Métodos de ArrayBlockingQueue
A ArrayBlockingQueue
classe fornece a implementação de todos os métodos da BlockingQueue
interface.
Esses métodos são usados para inserir, acessar e excluir elementos de filas de bloqueio de array.
Além disso, aprenderemos sobre dois métodos put()
e take()
que suportam a operação de bloqueio na fila de bloqueio de array.
Esses dois métodos distinguem a fila de bloqueio de array de outras filas típicas.
Inserir Elementos
add()
- Insere o elemento especificado na fila de bloqueio de array. Ele lança uma exceção se a fila estiver cheia.offer()
- Insere o elemento especificado na fila de bloqueio de array. Ele retornafalse
se a fila estiver cheia.
Por exemplo,
import java.util.concurrent.ArrayBlockingQueue; class Main ( public static void main(String() args) ( ArrayBlockingQueue animals = new ArrayBlockingQueue(5); // Using add() animals.add("Dog"); animals.add("Cat"); // Using offer() animals.offer("Horse"); System.out.println("ArrayBlockingQueue: " + animals); ) )
Resultado
ArrayBlockingQueue: (cachorro, gato, cavalo)
Elementos de Acesso
peek()
- Retorna um elemento da frente da fila de bloqueio de array. Ele retornanull
se a fila estiver vazia.iterator()
- Retorna um objeto iterador para acessar sequencialmente os elementos da fila de bloqueio de array. Ele lança uma exceção se a fila estiver vazia. Devemos importar ojava.util.Iterator
pacote para usá-lo.
Por exemplo,
import java.util.concurrent.ArrayBlockingQueue; import java.util.Iterator; class Main ( public static void main(String() args) ( ArrayBlockingQueue animals = new ArrayBlockingQueue(5); // Add elements animals.add("Dog"); animals.add("Cat"); animals.add("Horse"); System.out.println("ArrayBlockingQueue: " + animals); // Using peek() String element = animals.peek(); System.out.println("Accessed Element: " + element); // Using iterator() Iterator iterate = animals.iterator(); System.out.print("ArrayBlockingQueue Elements: "); while(iterate.hasNext()) ( System.out.print(iterate.next()); System.out.print(", "); ) ) )
Resultado
ArrayBlockingQueue: (Cachorro, Gato, Cavalo) Elemento acessado: Cachorro ArrayBlockingQueue Elementos: Cachorro, Gato, Cavalo,
Remover Elementos
remove()
- Retorna e remove um elemento especificado da fila de bloqueio de array. Ele lança uma exceção se a fila estiver vazia.poll()
- Retorna e remove um elemento especificado da fila de bloqueio de array. Ele retornanull
se a fila estiver vazia.clear()
- Remove todos os elementos da fila de bloqueio de array.
Por exemplo,
import java.util.concurrent.ArrayBlockingQueue; class Main ( public static void main(String() args) ( ArrayBlockingQueue animals = new ArrayBlockingQueue(5); animals.add("Dog"); animals.add("Cat"); animals.add("Horse"); System.out.println("ArrayBlockingQueue: " + animals); // Using remove() String element1 = animals.remove(); System.out.println("Removed Element:"); System.out.println("Using remove(): " + element1); // Using poll() String element2 = animals.poll(); System.out.println("Using poll(): " + element2); // Using clear() animals.clear(); System.out.println("Updated ArrayBlockingQueue: " + animals); ) )
Resultado
ArrayBlockingQueue: (Dog, Cat, Horse) Elementos removidos: Usando remove (): Dog Using poll (): Cat Atualizado ArrayBlockingQueue: ()
Método put () e take ()
Em processos multithreading, podemos usar put()
e take()
para bloquear a operação de um thread para sincronizá-lo com outro thread. Esses métodos irão esperar até que possam ser executados com sucesso.
método put ()
Para adicionar um elemento ao final de uma fila de bloqueio de array, podemos usar o put()
método.
Se a fila de bloqueio de array estiver cheia, ele espera até que haja espaço na fila de bloqueio de array para adicionar um elemento.
Por exemplo,
import java.util.concurrent.ArrayBlockingQueue; class Main ( public static void main(String() args) ( ArrayBlockingQueue animals = new ArrayBlockingQueue(5); try ( // Add elements to animals animals.put("Dog"); animals.put("Cat"); System.out.println("ArrayBlockingQueue: " + animals); ) catch(Exception e) ( System.out.println(e); ) ) )
Resultado
ArrayBlockingQueue: (cachorro, gato)
Aqui, o put()
método pode lançar um InterruptedException
se for interrompido durante a espera. Portanto, devemos colocá-lo dentro de um bloco try… catch.
Método take ()
Para retornar e remover um elemento da frente da fila de bloqueio de array, podemos usar o take()
método.
Se a fila de bloqueio de array estiver vazia, ele espera até que haja elementos na fila de bloqueio de array para serem excluídos.
Por exemplo,
import java.util.concurrent.ArrayBlockingQueue; class Main ( public static void main(String() args) ( ArrayBlockingQueue animals = new ArrayBlockingQueue(5); try ( //Add elements to animals animals.put("Dog"); animals.put("Cat"); System.out.println("ArrayBlockingQueue: " + animals); // Remove an element String element = animals.take(); System.out.println("Removed Element: " + element); ) catch(Exception e) ( System.out.println(e); ) ) )
Resultado
ArrayBlockingQueue: (Cachorro, Gato) Elemento Removido: Cachorro
Aqui, o take()
método lançará um InterrupedException
se for interrompido durante a espera. Portanto, devemos colocá-lo dentro de um try… catch
bloco.
Outros métodos
Métodos | Descrições |
---|---|
contains(element) | Pesquisa a fila de bloqueio de array para o elemento especificado. Se o elemento for encontrado, ele retorna true , se não, ele retorna false . |
size() | Retorna o comprimento da fila de bloqueio da matriz. |
toArray() | Converte a fila de bloqueio de matriz em uma matriz e a retorna. |
toString() | Converte a fila de bloqueio de array em string |
Por que usar ArrayBlockingQueue?
O ArrayBlockingQueue
usa arrays como seu armazenamento interno.
É considerada uma coleção thread-safe . Por isso, é geralmente usado em aplicações multi-threading.
Suponha que um thread está inserindo elementos na fila e outro thread está removendo elementos da fila.
Agora, se o primeiro encadeamento for mais lento do que o segundo encadeamento, a fila de bloqueio de matriz pode fazer o segundo encadeamento esperar até que o primeiro encadeamento conclua suas operações.