2010-07-11 23 views
6

¿Qué es el mensaje que pasa en Java? Si pudiera, por favor proporcione un ejemplo.¿Qué está pasando el mensaje?

+0

¿en qué contexto? – Bozho

+7

el paso de mensajes puede referirse a varias cosas diferentes, que van desde el simple método de invocación de objetos, a la comunicación entre hilos, a la comunicación distribuida entre diferentes computadoras, ¿de qué tipo se está preguntando? – TofuBeer

+0

¿Quiere decir "envío de mensajes" frente a "invocación de métodos"? En cuyo caso, la respuesta http://stackoverflow.com/questions/2852381/calling-a-method-or-sending-a-message-in-objective-c es buena. – ewernli

Respuesta

15

Paso de Mensajes En Java

  • Cuando un hilo envía un mensaje (un objeto) a otro hilo.

  • Se utiliza para la comunicación y sincronización de subprocesos en entornos donde los subprocesos no tienen memoria compartida. Por lo tanto, los subprocesos no pueden compartir semáforos o monitores y no pueden usar variables compartidas para comunicarse. El envío de mensajes aún se puede usar, por supuesto, en una plataforma de memoria compartida.

  • Los mensajes se envían a través de un canal con una operación como enviar (canal, mensaje) y se reciben de un canal con una operación como recibir (canal, mensaje). Los mensajes se pueden pasar de forma síncrona, es decir, el emisor bloquea hasta que el recibido recibe una recepción y el receptor bloquea hasta que el emisor envía un mensaje. Dado que el emisor y el receptor se encuentran en puntos conocidos específicos en su código en un instante de tiempo específico conocido, el paso de mensaje síncrono también se denomina encuentro simple con un flujo de información unidireccional desde el emisor hasta el receptor. Un ejemplo es un agente de juego de ajedrez. Los agentes pueden procesar mensajes de forma síncrona, ya que serán un apretón de manos durante todo el juego.

  • En la transmisión de mensajes asíncrona, el emisor no bloquea. Si no hay un receptor esperando recibir el mensaje, el mensaje está en cola o almacenado. El receptor todavía bloquea si no hay un mensaje en cola o almacenado en el búfer cuando se ejecuta una recepción.

+0

Esto realmente ayudó. ¡Gracias! – ericraio

+0

** 1) ** Para la interacción entre subprocesos, ¿Cuándo preferir 'send()'/'receive()' sobre 'get()'/'put()' en el objeto compartido? ** 2) ** Dijo que el mensaje que pasa se puede usar en la plataforma de memoria compartida, pero [respuesta] (https://stackoverflow.com/a/1853317/3317808) dice: * los trabajadores no pueden modificar los datos de los demás. * – overexchange

-1

Su pregunta es un poco vaga, pero supongo que podría estar refiriéndose a la API de Java Message Service? Si es así, Wikipedia puede informarle al respecto: http://en.wikipedia.org/wiki/Java_Message_Service

Pero si está hablando de mensajes más "genéricos", entonces le sugiero que eche un vistazo al enlace ewernli publicado.

+0

Sí. Estoy pidiendo en función de los métodos de llamada en el objeto – Pavalesh

12

Interacción clásica entre dos hilos: un Productor y un Consumidor.

import java.util.Vector; 

class Producer extends Thread { 
    static final int MAXQUEUE = 5; 
    private Vector messages = new Vector(); 

    public void run() { 
     try { 
      while (true) { 
       putMessage(); 
       sleep(1000); 
      } 
     } 
     catch(InterruptedException e) { } 
    } 

    private synchronized void putMessage() 
     throws InterruptedException { 

     while (messages.size() == MAXQUEUE) 
      wait(); 
     messages.addElement(new java.util.Date().toString()); 
     notify(); 
    } 

    // Called by Consumer 
    public synchronized String getMessage() 
     throws InterruptedException { 
     notify(); 
     while (messages.size() == 0) 
      wait(); 
     String message = (String)messages.firstElement(); 
     messages.removeElement(message); 
     return message; 
    } 
} 

class Consumer extends Thread { 
    Producer producer; 

    Consumer(Producer p) { 
     producer = p; 
    } 

    public void run() { 
     try { 
      while (true) { 
       String message = producer.getMessage(); 
       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(); 
    } 
} 
+0

Pero aún comparte un búfer para acceder a través de la sincronización. ¿Qué tan diferente es esto de la operación 'get()' y 'put()'? – overexchange

Cuestiones relacionadas