Ferramenta de programação simultânea Java JUC Parte 2: ArrayBlockingQueue

A classe ArrayBlockingQueueé BlockingQueuea 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.

ArrayBlockingQueueO 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 ArrayBlockingQueuee adicionar um objeto a ele:

BlockingQueue queue = new ArrayBlockingQueue(1024);
queue.put("1");   //向队列中添加元素
Object object = queue.take();   //从队列中取出元素

BlockingQueueGené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 ArrayBlockingQueuepara realmente realizar um exemplo de produção e consumo.

A classe BlockingQueueExampleabre dois encadeamentos independentes, um é o Producerencadeamento produtor, que é responsável por adicionar dados à fila, e o outro é o Consumerencadeamento 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.outpara 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 BlockingQueuedisso 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.

Acho que você gosta

Origin blog.csdn.net/hanxiaotongtong/article/details/115107810
Recomendado
Clasificación