2010-07-11 17 views
6

Che cos'è il messaggio che passa in Java? Se è possibile, si prega di fornire un esempio.Cosa passa il messaggio?

+0

in quale contesto? Il passaggio del messaggio – Bozho

+7

può riferirsi a diverse cose, che vanno dal semplice metodo di chiamata agli oggetti, alla comunicazione tra thread, alla comunicazione distribuita tra diversi computer - di quale tipo ti stai interrogando? – TofuBeer

+0

Intendi "invio messaggio" o "richiamo metodo"? Nel qual caso la risposta http://stackoverflow.com/questions/2852381/calling-a-method-or-sending-a-message-in-objective-c è buona. – ewernli

risposta

15

Message Passing In Java

  • Quando un thread invia un messaggio (un oggetto) a un altro thread.

  • Utilizzato per comunicazione thread e sincronizzazione in ambienti in cui i thread non hanno memoria condivisa Quindi i thread non possono condividere semafori o monitor e non possono utilizzare variabili condivise per comunicare. Il passaggio dei messaggi può ancora essere utilizzato, ovviamente, in una piattaforma di memoria condivisa.

  • I messaggi vengono inviati attraverso un canale con un'operazione come send (canale, messaggio) e ricevuti da un canale con un'operazione come receive (canale, messaggio). I messaggi possono essere passati in modo sincrono, vale a dire i blocchi del mittente fino a quando il destinatario non riceve un messaggio e il destinatario blocca fino a quando il mittente non invia un messaggio. Poiché il mittente e il ricevente si trovano in specifici punti noti del loro codice in un momento specifico noto di tempo, il passaggio sincrono dei messaggi viene anche chiamato un semplice rendez-vous con un flusso di informazioni unidirezionale dal mittente al ricevente. Un esempio è un agente di gioco di scacchi. Gli agenti possono elaborare i messaggi in modo sincrono, dal momento che saranno handshaking durante l'intero gioco.

  • Nel passaggio di messaggi asincroni, il mittente non blocca. Se non c'è un ricevitore in attesa di ricevere il messaggio, il messaggio viene accodato o memorizzato nel buffer. Il ricevitore blocca ancora se non vi è alcun messaggio in coda o buffered quando viene eseguito un ricevimento.

+0

Questo davvero aiutato. Grazie! – ericraio

+0

** 1) ** Per l'interazione tra thread, Quando preferire 'send()'/'receive()' su 'get()'/'put()' su oggetto condiviso? ** 2) ** Hai detto che il passaggio dei messaggi può essere utilizzato nella piattaforma di memoria condivisa, ma [risposta] (https://stackoverflow.com/a/1853317/3317808) dice, * i lavoratori non possono modificare i dati l'uno dell'altro. * – overexchange

-1

La tua domanda è un po 'vaga, ma suppongo che potresti riferirti all'API del servizio messaggi Java? Se è così, Wikipedia può dirti tutto: http://en.wikipedia.org/wiki/Java_Message_Service

Ma se stai parlando di più messaggi "generici" che passano, allora ti suggerisco di dare un'occhiata al link ewernli pubblicato!

+0

Sì. Sto chiedendo in base alla chiamata metodi sull'oggetto – Pavalesh

12

Interazione classica tra due thread: un produttore e un consumatore.

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

Ma ancora si condivide un buffer per accedere attraverso la sincronizzazione. Quanto è diverso l'operazione 'get()' e 'put()'? – overexchange

Problemi correlati