Java BlockingQueue
Java BlockingQueue
Neste tutorial, aprenderemos sobre a interface Java BlockingQueue e seus métodos.
O
BlockingQueue
interface do Java Collections
framework estende o Queue
interface. Ele permite que qualquer operação espere até que possa ser executada com sucesso. Por exemplo, se quisermos excluir um elemento de uma fila vazia, a fila de bloqueio permite que a operação de exclusão aguarde até que a fila contenha alguns elementos a serem excluídos.
Classes que implementam BlockingQueue
Desde
BlockingQueue
é uma interface, não podemos fornecer a implementação direta dela. Para usar a funcionalidade do
BlockingQueue
, precisamos usar classes que o implementam. - ArrayBlockingQueue
- LinkedBlockingQueue
Como usar filas de bloqueio?
Devemos importar o
java.util.concurrent.BlockingQueue
pacote para usar BlockingQueue
.
// Array implementation of BlockingQueue
BlockingQueue<String> animal1 = new ArraryBlockingQueue<>();
// LinkedList implementation of BlockingQueue
BlockingQueue<String> animal2 = new LinkedBlockingQueue<>();
Aqui, criamos objetos animal1 e animal2 de classes
ArrayBlockingQueue
e LinkedBlockingQueue
, respectivamente. Esses objetos podem usar as funcionalidades do BlockingQueue
interface. Métodos de bloqueio de fila
Com base no fato de uma fila estar cheia ou vazia, os métodos de uma fila de bloqueio podem ser divididos em 3 categorias:
Métodos que lançam uma exceção
add()
- Insere um elemento na fila de bloqueio no final da fila. Lança uma exceção se a fila estiver cheia.element()
- Retorna o cabeçalho da fila de bloqueio. Lança uma exceção se a fila estiver vazia.remove()
- Remove um elemento da fila de bloqueio. Lança uma exceção se a fila estiver vazia.
Métodos que retornam algum valor
offer()
- Insere o elemento especificado na fila de bloqueio no final da fila. Retornafalse
se a fila estiver cheia.peek()
- Retorna o cabeçalho da fila de bloqueio. Retornanull
se a fila estiver vazia.poll()
- Remove um elemento da fila de bloqueio. Retornanull
se a fila estiver vazia.
Mais sobre offer() e poll()
O
offer()
e poll()
pode ser usado com timeouts. Ou seja, podemos passar unidades de tempo como parâmetro. Por exemplo,
offer(value, 100, milliseconds)
Aqui,
- valor é o elemento a ser inserido na fila
- E definimos um tempo limite de 100 milissegundos
Isso significa que o
offer()
tentará inserir um elemento na fila de bloqueio para 100
milissegundos. Se o elemento não puder ser inserido em 100 milissegundos, o método retornará false
. Observação: Em vez de
milliseconds
, também podemos usar estas unidades de tempo:days
, hours
, minutes
, seconds
, microseconds
e nanoseconds
em offer()
e poll()
métodos. Métodos que bloqueiam a operação
O
BlockingQueue
também fornece métodos para bloquear as operações e aguardar se a fila estiver cheia ou vazia. put()
- Insere um elemento na fila de bloqueio. Se a fila estiver cheia, ela aguardará até que a fila tenha espaço para inserir um elemento.take()
- Remove e retorna um elemento da fila de bloqueio. Se a fila estiver vazia, ela aguardará até que a fila tenha elementos a serem excluídos.
Suponha que queremos inserir elementos em uma fila. Se a fila estiver cheia, o
put()
O método aguardará até que a fila tenha espaço para inserir elementos. Da mesma forma, se quisermos excluir elementos de uma fila. Se a fila estiver vazia, o
take()
O método aguardará até que a fila contenha elementos a serem excluídos. Implementação de BlockingQueue em ArrayBlockingQueue
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ArrayBlockingQueue;
class Main {
public static void main(String[] args) {
// Create a blocking queue using the ArrayBlockingQueue
BlockingQueue<Integer> numbers = new ArrayBlockingQueue<>(5);
try {
// Insert element to blocking queue
numbers.put(2);
numbers.put(1);
numbers.put(3);
System.out.println("BLockingQueue: " + numbers);
// Remove Elements from blocking queue
int removedNumber = numbers.take();
System.out.println("Removed Number: " + removedNumber);
}
catch(Exception e) {
e.getStackTrace();
}
}
}
Saída
BlockingQueue: [2, 1, 3] Removed Element: 2
Para saber mais sobre
ArrayBlockingQueue
, visite Java ArrayBlockingQueue. Por que bloquear fila?
Em Java,
BlockingQueue
é considerado o segmento seguro coleção. É porque pode ser útil em operações multi-threading. Suponha que uma thread esteja inserindo elementos na fila e outra thread esteja removendo elementos da fila.
Agora, se o primeiro encadeamento for executado mais lentamente, a fila de bloqueio pode fazer o segundo encadeamento esperar até que o primeiro encadeamento conclua sua operação.
Java