Herramienta de programación concurrente de Java JUC Parte 2: ArrayBlockingQueue

La clase ArrayBlockingQueuees BlockingQueuela clase de implementación de la interfaz, es una cola de bloqueo limitada y usa una matriz para almacenar los elementos de la cola internamente . "Limitado" aquí significa que hay un límite superior en la capacidad de almacenamiento y los elementos no se pueden almacenar infinitamente. Existe un límite superior de capacidad de almacenamiento al mismo tiempo. Este límite superior se especifica en el momento de la instanciación inicial y no se puede modificar posteriormente.

ArrayBlockingQueueEl método FIFO (First In, First Out) se utiliza internamente para realizar el acceso a los datos de la cola. El elemento al principio de la cola es el objeto de elemento con el tiempo de almacenamiento más largo en la cola y el elemento al final de la cola. es el tiempo de almacenamiento más corto de la cola. Objeto de elemento.

El siguiente código muestra cómo inicializar uno ArrayBlockingQueuey agregarle un objeto:

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

BlockingQueueLos genéricos se pueden usar para limitar el tipo de datos almacenados en la cola. El siguiente código usa String como genérico, lo que significa que la cola solo puede almacenar tipos de String.

BlockingQueue<String> queue = new ArrayBlockingQueue<String>(1024);
queue.put("1");
String string = queue.take();

Darse cuenta de una instancia de producción y consumo

En el artículo anterior, hemos hablado de lo siguiente: BlockingQueue se usa a menudo para producir y consumir colas de búfer. A continuación, lo usaremos ArrayBlockingQueuepara realizar realmente un ejemplo de producción y consumo.

La clase BlockingQueueExampleabre dos subprocesos independientes, uno es el Producersubproceso productor, que es responsable de agregar datos a la cola; el otro es el Consumersubproceso consumidor, que es responsable de eliminar datos de la cola para su procesamiento.

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);
    }
}

La clase Produceres un productor y put()un objeto se coloca en la cola usando un método cada 10 segundos y se coloca en ella tres veces. En este intervalo de 10 segundos, el hilo del consumidor se bloqueará después de que el consumidor elimine los datos de la cola.

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();
        }
    }
}

El siguiente código es una clase de consumidor Consumer, que obtiene el objeto de elemento a procesar desde la cola y llama System.outpara imprimirlo.

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();
        }
    }
}

El código anterior imprime el resultado se imprime una vez cada 10 segundos, porque take()el método no es un elemento a tomar cuando el consumidor bloqueará el hilo actual, por lo que están en un estado de espera en la cola, este método que presentamos en la sección anterior BlockingQueueYa se ha explicado en ese momento.

Bienvenido a seguir mi blog, hay muchas colecciones boutique.

  • Este artículo se reproduce con una indicación de la fuente (se debe adjuntar la conexión y el texto no se puede reproducir únicamente): Blog de Letter Brother .

Si crees que es útil para ti, ¡dale me gusta y compártelo! ¡Tu apoyo es mi inagotable motivación creativa! . Además, el autor ha publicado el siguiente contenido de alta calidad recientemente y espero su atención.

Supongo que te gusta

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