Paso de mensajes en Java

¿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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *