Finalmente entender a fondo! Una comprensión gráfica del caso roscado multi-Java de los productores y consumidores de patrones de diseño

Antes de sugerencias de lectura

Si el papel tiene que tener una comprensión más profunda de las recomendaciones mirar flujos seguros, callejones sin salida de rosca, y la comunicación de conocimientos hilo relacionado, si ya tiene un conocimiento suficiente de estos, creo que usted debe leer este gratificante el blog!

comprensión en profundidad de las hebras Java - Bancos me deben cuatro millones! ! !

Un minuto ilustración del estancamiento hilo de Java con un cuento antes de dormir

En primer lugar, la escena del diseño

 Existente dos hilos, el hilo es a efecto cadena de caracteres 'A' 'B' 'C ' 'D' 'E' o 'F' 'G' 'H ' 'I' 'J' en la Lista de Array recipiente ( ), pero con el fin de garantizar la seguridad de la rosca, sólo se puede hacer una conexión de rosca, por lo que cada hilo debe adquirir el bloqueo al objeto recurso crítico que está marcado contenedor para acceder al objeto, y luego realizar las operaciones de almacenamiento de datos;
 sin embargo, cada hilo de cada cinco veces el número de caracteres almacenados, y el contenedor sólo puede almacenarse en cuatro cuerdas, cuando el quinto hilo de cadena en el recipiente, para evitar procedimientos anormales, el hilo esperará indefinidamente en la cola, y notificar al acceso a los consumidores de datos;
 del mismo modo, una pluralidad de consumidores, sino que también tienen acceso a los datos calificar marca de bloqueo, asumiendo un consumidor consumer, los consumidores acceso a los datos, se lleva a cabo una hipótesis, cuando el contenedor cuando los datos se ha tomado con el fin de garantizar el hilo de seguridad, el hilo esperará indefinidamente en la cola, y notificar el productor de los datos almacenados;
Aquí Insertar imagen Descripción
 todo el proceso es patrones de diseño de hilos de java entre productores y consumidores;

En segundo lugar, la introducción de los productores y consumidores

 Primero tiene que entender la naturaleza de los productores y los consumidores están hilo, un número de productores en la producción de productos que estarán disponibles para tomar una serie de gasto de los consumidores, con el fin de hacer que los productores y consumidoresejecución concurrenteEn entre los dos conjunto un tampón capaz de almacenar una pluralidad de productos, los productores producirá el producto en la memoria intermedia, los productos de consumo eliminan de la memoria intermedia para el consumo, obviamente debe estar entre productores y consumidores para mantener el ritmo, no sólo no permitir a los consumidores productos de eliminación de un buffer vacío, sino que también permiten al productor para agregar productos a un búfer completo.

En tercer lugar, el código reproducción escenario

 En primer lugar, la necesidad de crear una clase de contenedor Queue, la capacidad máxima del contenedor 4, el tipo es ArrayListel tipo de recipiente proporciona dos métodos, un método se almacena offer(), proporcionado a las llamadas de rosca productor; Otro método consiste en eliminar poll(), a las llamadas hilo consumidor ; para satisfacer mantener la sincronización entre productores y consumidores, cada método tiene que hacer tres cosas:

  • 1. Para garantizar la seguridad hilo, debe ser bloqueado contenedor, que sólo se puede hacer que el hilo que sostiene el acceso variable de bloqueo; En este método requiere una synchronizedmodificación;
  • 2. Cuando el recipiente es a tiempo completo o vacío (tamaño == 0 o tamaño == 4), el hilo correspondiente en los consumidores o hilo consumidor espera indefinidamente, llamando al wait()método;
  • O inferior a 3. Cuando el recipiente no está vacía, los consumidores correspondiente notificación productores a producir añadió, una correspondiente consumidor productor notificación gasto retira;

Aquí Insertar imagen Descripción

Simulación área buffer de datos

//我的队列
class MyQueue {

    private List values = new ArrayList();

    private int max = 4;

    //存入队列
    public synchronized void offer(Object o){//E

        while(values.size() == max){
            //进来线程,停下
            try {
                this.wait();
                //被唤醒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        this.notifyAll();
		values.add(o);
        System.out.println(Thread.currentThread().getName() + "存入元素 : "+ values );
    }

    //从队列取出
    public synchronized Object poll(){//1个元素

        while(values.size() == 0){
            try {
                this.wait();
                //被唤醒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        this.notifyAll();//唤醒因mq对象而进入无限期等待的线程对象(一个)

        return values.remove(0);
    }
}

simulación de productores

 El productor es esencialmente un hilo aquí utiliza dos productores, a saber, el acceso multi-roscado, un objeto crítico recurso Queue, sólo el hilo que sostiene la marca de bloqueo cuando el objeto se puede acceder al objeto, y entonces la acción apropiada.

//生产者1
class Produce1 extends Thread{
    MyQueue mq;
    public Produce1(MyQueue mq){
        this.mq = mq;
    }

    public void run(){
        System.out.println("Produce1启动");
        for (char ch = 'A'; ch <= 'E'; ch++) {
            mq.offer(ch);
        }
        System.out.println("Produce1结束");
    }
}
//生产者2
class Produce2 extends Thread{
    MyQueue mq;
    public Produce2(MyQueue mq){
        this.mq = mq;
    }

    public void run(){
        System.out.println("Produce2启动");
        for (char ch = 'F'; ch <= 'J'; ch++) {
            mq.offer(ch);
        }
        System.out.println("Produce2结束");
    }
}

Los consumidores de simulación

 Los consumidores también un hilo en la naturaleza, por supuesto, los consumidores pueden tener los mismos productores como múltiples, de forma similar, sólo aquellos con los hilos de consumo de bloqueo marcado tener el derecho a operar objeto recurso crítico; Para mayor comodidad, considere un consumidor;

//消费者
class Consumer extends Thread{
    MyQueue mq;
    public Consumer(MyQueue mq){
        this.mq = mq;
    }

    public void run(){
        for (int i = 0 ; i < 10 ; i++) {//循环取数据
            System.out.println(mq.poll() + "被移除");
        }
    }
}

La función principal

 La función principal es permitir que todas las discusiones iniciadas pueden ser!

public static void main(String[] args) {

    MyQueue mq = new MyQueue();

    Produce1 p1 = new Produce1(mq);
    Produce2 p2 = new Produce2(mq);
    Consumer c1 = new Consumer(mq);

    p1.start();
    p2.start();
    c1.start();


    System.out.println("main end");
}

Los resultados operativos

Aquí Insertar imagen Descripción
 imprimir claramente los resultados han sido muy claros en todo el proceso nos dice que los consumidores y productores de ejecución concurrente, creo que su mente se ha formado una imagen animada, espero que entienda que hay ayuda! Por supuesto, si es conveniente, por favor anime a sus pulgares! Se agradecido!

Publicado 84 artículos originales · ganado elogios 126 · vistas 120 000 +

Supongo que te gusta

Origin blog.csdn.net/qq_44717317/article/details/104884787
Recomendado
Clasificación