Simultaneidade Java - Interface BlockingQueue
Uma interface java.util.concurrent.BlockingQueue é uma subinterface da interface Queue e, adicionalmente, suporta operações como esperar que a fila se torne vazia antes de recuperar um elemento e esperar que o espaço fique disponível na fila antes de armazenar um elemento .
Métodos BlockingQueue
Sr. Não. | Método e Descrição |
---|---|
1 | boolean add(E e) Insere o elemento especificado nesta fila se for possível fazê-lo imediatamente sem violar as restrições de capacidade, retornando true em caso de sucesso e lançando uma IllegalStateException se nenhum espaço estiver disponível no momento. |
2 | boolean contains(Object o) Retorna verdadeiro se esta fila contém o elemento especificado. |
3 | int drainTo(Collection<? super E> c) Remove todos os elementos disponíveis desta fila e os adiciona à coleção fornecida. |
4 | int drainTo(Collection<? super E> c, int maxElements) Remove no máximo o número fornecido de elementos disponíveis desta fila e os adiciona à coleção fornecida. |
5 | boolean offer(E e) Insere o elemento especificado nesta fila se for possível fazê-lo imediatamente sem violar as restrições de capacidade, retornando verdadeiro em caso de sucesso e falso se nenhum espaço estiver disponível. |
6 | boolean offer(E e, long timeout, TimeUnit unit) Insere o elemento especificado nesta fila, aguardando o tempo de espera especificado, se necessário, para que o espaço fique disponível. |
7 | E poll(long timeout, TimeUnit unit) Recupera e remove o início desta fila, aguardando até o tempo de espera especificado, se necessário, para que um elemento fique disponível. |
8 | void put(E e) Insere o elemento especificado nesta fila, aguardando, se necessário, que o espaço se torne disponível. |
9 | int remainingCapacity() Retorna o número de elementos adicionais que esta fila pode idealmente (na ausência de restrições de memória ou recursos) aceitar sem bloqueio, ou Integer.MAX_VALUE se não houver limite intrínseco. |
10 | boolean remove(Object o) Remove uma única instância do elemento especificado desta fila, se estiver presente. |
11 | E take() Recupera e remove o início desta fila, aguardando se necessário até que um elemento esteja disponível. |
Exemplo
O programa TestThread a seguir mostra o uso da interface BlockingQueue em um ambiente baseado em thread.
import java.util.Random;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
public class TestThread {
public static void main(final String[] arguments) throws InterruptedException {
BlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(10);
Producer producer = new Producer(queue);
Consumer consumer = new Consumer(queue);
new Thread(producer).start();
new Thread(consumer).start();
Thread.sleep(4000);
}
static class Producer implements Runnable {
private BlockingQueue<Integer> queue;
public Producer(BlockingQueue queue) {
this.queue = queue;
}
@Override
public void run() {
Random random = new Random();
try {
int result = random.nextInt(100);
Thread.sleep(1000);
queue.put(result);
System.out.println("Added: " + result);
result = random.nextInt(100);
Thread.sleep(1000);
queue.put(result);
System.out.println("Added: " + result);
result = random.nextInt(100);
Thread.sleep(1000);
queue.put(result);
System.out.println("Added: " + result);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
static class Consumer implements Runnable {
private BlockingQueue<Integer> queue;
public Consumer(BlockingQueue queue) {
this.queue = queue;
}
@Override
public void run() {
try {
System.out.println("Removed: " + queue.take());
System.out.println("Removed: " + queue.take());
System.out.println("Removed: " + queue.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Isso produzirá o seguinte resultado.
Resultado
Added: 52
Removed: 52
Added: 70
Removed: 70
Added: 27
Removed: 27