2010-07-11 2 views
6

Quel est le message passant en Java? Si vous le pouvez, donnez un exemple.Qu'est-ce que le passage de message?

+0

dans quel contexte? – Bozho

+7

Le passage de message peut se rapporter à plusieurs choses différentes, allant de la simple méthode d'appel sur des objets, à la communication entre les threads, à la communication répartie entre différents ordinateurs - de quel type vous interrogez-vous? – TofuBeer

+0

Voulez-vous dire "envoi de message" par opposition à "invocation de méthode"? Dans ce cas, la réponse http://stackoverflow.com/questions/2852381/calling-a-method-or-sending-a-message-in-objective-c est une bonne réponse. – ewernli

Répondre

15

Message Passing En Java

  • Lorsqu'un thread envoie un message (un objet) à un autre thread.

  • Utilisé pour la communication de thread et la synchronisation dans des environnements où les threads n'ont pas de mémoire partagée Les threads ne peuvent donc pas partager des sémaphores ou des moniteurs et ne peuvent pas utiliser de variables partagées pour communiquer. Le passage de message peut toujours être utilisé, bien sûr, dans une plate-forme de mémoire partagée.

  • Les messages sont envoyés via un canal avec une opération comme envoi (canal, message) et reçus d'un canal avec une opération comme réception (canal, message). Les messages peuvent être transmis de manière synchrone, ce qui signifie que l'expéditeur se bloque jusqu'à ce que le destinataire reçoive une réception et que le destinataire se bloque jusqu'à ce que l'expéditeur effectue un envoi. Puisque l'expéditeur et le destinataire sont à des points connus spécifiques dans leur code à un instant spécifique connu, le passage de message synchrone est également appelé un simple rendez-vous avec un flux d'informations unidirectionnel de l'expéditeur vers le destinataire. Un exemple est un agent de jeu d'échecs. Les agents peuvent traiter les messages de manière synchrone, puisqu'ils seront en train de se passer une poignée de main tout au long de la partie.

  • Lors du passage de message asynchrone, l'expéditeur ne bloque pas. S'il n'y a pas de récepteur en attente de réception du message, le message est mis en file d'attente ou tamponné. Le récepteur bloque toujours s'il n'y a pas de message mis en file d'attente ou tamponné lorsqu'une réception est exécutée.

+0

Cela a vraiment aidé. Merci! – ericraio

+0

** 1) ** Pour l'interaction entre les threads, Quand préférer 'send()'/'receive()' sur 'get()'/'put()' sur un objet partagé? ** 2) ** Vous avez dit que le passage de message peut être utilisé dans la plate-forme de mémoire partagée, mais [répondre] (https://stackoverflow.com/a/1853317/3317808) dit, * les travailleurs ne peuvent pas modifier les données de l'autre. * – overexchange

-1

Votre question est un peu vague, mais je suppose que vous faites peut-être référence à l'API Java Message Service? Si oui, Wikipedia peut tout vous dire à ce sujet: http://en.wikipedia.org/wiki/Java_Message_Service

Mais si vous parlez de plus de "générique" de passage de messages, alors je vous suggère de jeter un oeil sur le lien ewernli posté!

+0

Oui. Je demande en fonction des méthodes d'appel sur l'objet – Pavalesh

12

Interaction classique entre deux threads: un producteur et un consommateur.

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

vous partagez toujours un tampon pour accéder à la synchronisation. En quoi cela diffère-t-il de l'opération 'get()' et 'put()'? – overexchange

Questions connexes