Varias formas de implementar el modelo de productor y consumidor
Tome el ejemplo en nuestras vidas como ejemplo. Los productos producidos por las fábricas siempre se exportan para usar afuera. Este es el concepto de producción y consumo.
En nuestro proceso de desarrollo de software real, a menudo encontramos los siguientes escenarios: un módulo es responsable de generar datos, y estos datos se procesan mediante otro módulo (el módulo aquí está generalizado, que puede ser clases, funciones, hilos, procesos, etc.).
El módulo que genera datos se llama vívidamente un productor; mientras que el módulo que procesa datos se llama consumidor.
El primer tipo: use Wait-Notify para implementar el modelo de productor y consumidor
1. Un productor y un consumidor:
2. Un productor y múltiples consumidores:
El segundo tipo: Uso de colas de bloqueo para implementar el modelo de productor y consumidor
3. Use colas de bloqueo para implementar el patrón del consumidor del productor
Creo que todos han ido a la cocina japonesa. Hay una comida muy atractiva que es la barbacoa. El maestro de la barbacoa se parará a un lado y seguirá a la barbacoa, y luego pondrá la carne asada en un plato; Y los comensales que babearemos nos sentaremos a un lado, y seguiremos comiendo mientras haya carne en el plato.
En este caso de la vida, el maestro de barbacoa es el productor, y es responsable de la barbacoa. Después del tostado, pone la carne en el plato en lugar de entregarla directamente al comensal (es decir, no hay necesidad de notificar al comensal para comer carne). Si la carne en el plato está llena, el maestro se detendrá por un tiempo hasta que alguien vaya a comer la barbacoa antes de producir la carne; Y los comensales solo miran el plato, y una vez que hay carne en el plato, somos responsables de comerlo;
Durante todo el proceso, los comensales y el maestro de barbacoa no trataron directamente entre sí, sino que interactuaron con la placa.
La placa actúa como un concepto de amortiguación. Si se produce algo, póngalo. La placa también tiene un límite de tamaño. Si excede el tamaño de la placa, bloqueará la producción del productor y esperará a que el consumidor consuma; Cuando la placa está vacía, bloqueará el consumo de consumidores y esperará a que produzca el productor.
Bloquear la cola durante la programación puede realizar la función del disco.
Características de las colas de bloqueo:
Cuando el elemento de cola esté lleno, bloquee la operación de inserción;
Cuando el elemento de cola está vacío, la operación de adquisición está bloqueada.
Tanto ArrayBlockingqueue como LinkedBlokingqueue admiten FIFO (primero en, primero en salir), pero LinkedBlokingqueue está ilimitado, mientras que ArrayBockingqueue está limitado.
Lo siguiente utiliza colas de bloqueo para implementar productores y consumidores:
Productor:
import java.util.concurrent.blockingqueue; el productor de clase pública implementa runnable {private final Bloquingqueue Bloquingqueue; // Establezca el tamaño del caché de la cola. La producción se detendrá temporalmente después de superar este tamaño durante el proceso de producción. Private final int queue_size = 10; public Producer (Bloquingqueue Bloquingqueue) {this.Blowingqueue = Bloquingqueue;} int tarea = 1; @Override public void run () {while (true) {try {System.out.Println ("Production:"+Task); // Poner el producto producido en el Producto Producido en el Cachequeue. un tiempo para facilitar ver el efecto Thread.sleep (1000);} Catch (InterruptedException e) {E.PrintStackTrace ();}}}}consumidor:
import java.util.concurrent.blockingqueue; // Consumer public class Consumer implementa runnable {private final Bloquingqueue Bloquingqueue; public Consumer (Bloquingqueue Bloquingqueue) {this.Blockingqueue = Bloquingqueue;}@anular public Void Run () {System.out.println ("Consumying:" + Bloquingqueue.take ()); // Déjelo detener durante un tiempo para facilitar la visualización del efecto.prueba:
import java.util.concurrent.blowingqueue; import java.util.concurrent.linkedBlockingqueue;/** * Modo de consumo del productor * Use el bloqueo de la cola de bloqueo Bloquequee * @author wanggenshen * */public class testconpro {public void void main (string [] args) {blockqueue bloquequee = newedqueue; p = nuevo productor (Bloquingqueue); Consumer C = New Consumer (Bloquingqueue); Thread tp = New Thread (P); Thread tc = New Thread (c); tp.start (); tc.start ();}}Debido a que Linked Bloquingqueue es una cola ilimitada, los productores continuarán produciendo, pondrán las tareas producidas en la cola y los consumidores consumirán en la cola:
Si usa el BloinBlokingue de matriz de bloqueo de bloqueo limitado, puede inicializar el tamaño de la cola. Luego, cuando los elementos en la cola excedan el tamaño de la cola, el productor esperará a que el consumidor consuma uno y luego produzca el otro:
Código de prueba:
Inicialice una matriz de matriz de tamaño 10:
public static void main (string [] args) {Bloquingqueue Bloquingqueue = new ArrayBlowingqueue (10); productor p = nuevo productor (Bloquingqueue); Consumer C = New Consumer (Bloquingqueue); Thread tp = New Thread (P); Thread tc = New Thread (C); Tp.Start (); TC.Start ();}Durante la prueba, a los productores se les permitió producir un poco más rápido, mientras que los consumidores eran más lentos. Puede ver que la diferencia entre el número de serie producido del producto y el número de serie del producto consumido es siempre 10 (el tamaño de la cola):
Resumir
Lo anterior es todo el contenido de este artículo sobre el método de implementación del modelo de consumo de producción y los ejemplos de código de problemas de seguridad de hilos. Espero que sea útil para todos. Los amigos interesados pueden continuar referiéndose a otros temas relacionados en este sitio. Si hay alguna deficiencia, deje un mensaje para señalarlo. ¡Gracias amigos por su apoyo para este sitio!