¿Qué es el paso de mensajes y por qué se utiliza?
El paso de mensajes en términos de computadoras es la comunicación entre procesos. Es una forma de comunicación utilizada en la programación orientada a objetos, así como en la programación paralela. El paso de mensajes en Java es como enviar un objeto, es decir, un mensaje de un hilo a otro hilo. Se usa cuando los subprocesos no tienen memoria compartida y no pueden compartir monitores o semáforos o cualquier otra variable compartida para comunicarse. Supongamos que consideramos un ejemplo de productor y consumidor, del mismo modo lo que producirá el productor, el consumidor podrá consumir solo eso. Principalmente usamos Queue para implementar la comunicación entre hilos.
En el ejemplo que se explica a continuación, usaremos vector (cola) para almacenar los mensajes, 7 a la vez y luego el productor esperará al consumidor hasta que la cola esté vacía.
En Producer hay dos métodos sincronizados putMessage() que llamarán al método run() de Producer y agregarán el mensaje en Vector mientras que getMessage() extrae el mensaje de la cola para el consumidor.
El uso del paso de mensajes simplifica el problema productor-consumidor, ya que no tienen que hacer referencia entre sí directamente, sino que solo se comunican a través de una cola.
Ejemplo:
import java.util.Vector; class Producer extends Thread { // initialization of queue size static final int MAX = 7; private Vector messages = new Vector(); @Override public void run() { try { while (true) { // producing a message to send to the consumer putMessage(); // producer goes to sleep when the queue is full sleep(1000); } } catch (InterruptedException e) { } } private synchronized void putMessage() throws InterruptedException { // checks whether the queue is full or not while (messages.size() == MAX) // waits for the queue to get empty wait(); // then again adds element or messages messages.addElement(new java.util.Date().toString()); notify(); } public synchronized String getMessage() throws InterruptedException { notify(); while (messages.size() == 0) wait(); String message = (String)messages.firstElement(); // extracts the message from the queue messages.removeElement(message); return message; } } class Consumer extends Thread { Producer producer; Consumer(Producer p) { producer = p; } @Override public void run() { try { while (true) { String message = producer.getMessage(); // sends a reply to producer got a message System.out.println("Got message: " + message); sleep(2000); } } catch (InterruptedException e) { } } public static void main(String args[]) { Producer producer = new Producer(); producer.start(); new Consumer(producer).start(); } }
Producción:
Got message: Thu May 09 06:57:53 UTC 2019 Got message: Thu May 09 06:57:54 UTC 2019 Got message: Thu May 09 06:57:55 UTC 2019 Got message: Thu May 09 06:57:56 UTC 2019 Got message: Thu May 09 06:57:57 UTC 2019 Got message: Thu May 09 06:57:58 UTC 2019 Got message: Thu May 09 06:57:59 UTC 2019 Got message: Thu May 09 06:58:00 UTC 2019
Publicación traducida automáticamente
Artículo escrito por niharika123 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA