A classe ArrayBlockingQueue
é BlockingQueue
a classe de implementação da interface. É uma fila de bloqueio limitada e usa uma matriz para armazenar os elementos da fila internamente . "Limitado" aqui significa que há um limite superior na capacidade de armazenamento e os elementos não podem ser armazenados infinitamente. Há um limite superior de capacidade de armazenamento ao mesmo tempo. Esse limite superior é especificado no momento da instanciação inicial e não pode ser modificado posteriormente.
ArrayBlockingQueue
O método FIFO (First In, First Out) é usado internamente para realizar o acesso aos dados da fila. O elemento no topo da fila é o objeto de elemento com o tempo de armazenamento mais longo na fila e o elemento no final da fila é o menor tempo de armazenamento na fila. Objeto de elemento.
O código a seguir mostra como inicializar um ArrayBlockingQueue
e adicionar um objeto a ele:
BlockingQueue queue = new ArrayBlockingQueue(1024);
queue.put("1"); //向队列中添加元素
Object object = queue.take(); //从队列中取出元素
BlockingQueue
Genéricos podem ser usados para limitar o tipo de dados armazenados na fila. O código a seguir usa String como genérico, o que significa que a fila só pode armazenar tipos de String.
BlockingQueue<String> queue = new ArrayBlockingQueue<String>(1024);
queue.put("1");
String string = queue.take();
Realize uma instância de produção e consumo
No artigo anterior, falamos sobre: BlockingQueue é freqüentemente usado para produzir e consumir filas de buffer. A seguir, vamos usá-lo ArrayBlockingQueue
para realmente realizar um exemplo de produção e consumo.
A classe BlockingQueueExample
abre dois encadeamentos independentes, um é o Producer
encadeamento produtor, que é responsável por adicionar dados à fila, e o outro é o Consumer
encadeamento consumidor, que é responsável por remover os dados da fila para processamento.
public class BlockingQueueExample {
public static void main(String[] args) throws Exception {
//使用ArrayBlockingQueue初始化一个BlockingQueue,指定容量的上限为1024
BlockingQueue queue = new ArrayBlockingQueue(1024);
Producer producer = new Producer(queue); //生产者
Consumer consumer = new Consumer(queue); //消费者
new Thread(producer).start(); //开启生产者线程
new Thread(consumer).start(); //开启消费者线程
Thread.sleep(4000);
}
}
A classe Producer
é uma produtora e put()
um objeto é colocado na fila usando um método a cada 10 segundos e três vezes. Nesse intervalo de 10 segundos, o encadeamento do consumidor será bloqueado depois que os dados da fila forem retirados pelo consumidor.
public class Producer implements Runnable{
protected BlockingQueue queue = null;
public Producer(BlockingQueue queue) {
this.queue = queue;
}
public void run() {
try {
queue.put("1");
Thread.sleep(10000);
queue.put("2");
Thread.sleep(10000);
queue.put("3");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
O código a seguir é uma classe de consumidor Consumer
, que obtém o objeto do elemento a ser processado da fila e faz chamadas System.out
para imprimi-lo.
public class Consumer implements Runnable{
protected BlockingQueue queue = null;
public Consumer(BlockingQueue queue) {
this.queue = queue;
}
public void run() {
try {
System.out.println(queue.take());
System.out.println(queue.take());
System.out.println(queue.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
O código acima imprime o resultado é impresso uma vez a cada 10 segundos, porque take()
o método não é um elemento a ser tomado quando o consumidor irá bloquear o thread atual, então eles estão em um estado de espera na fila, este método que introduzimos na seção anterior BlockingQueue
disso já foi explicado naquela época.
Bem-vindo a seguir meu blog, existem muitas coleções boutique
- Este artigo é reproduzido com a indicação da fonte (a conexão deve ser anexada, e o texto não pode ser reproduzido somente): Carta Blog da Brother .
Se você acha que é útil para você, por favor, curta e compartilhe para mim! Seu apoio é minha motivação criativa inesgotável! . Além disso, o autor produziu o seguinte conteúdo de alta qualidade recentemente e espero sua atenção.