2010-07-11 3 views
6

Что такое передача сообщений на Java? Если бы вы могли, просьба привести пример.Что такое передача сообщений?

+0

В каком контексте? – Bozho

+7

Передача сообщений может относиться к нескольким различным вещам, начиная от простого вызова метода на объектах, до связи между потоками, до распределенной связи между разными компьютерами - какой тип вас интересует? – TofuBeer

+0

Вы имеете в виду «отправку сообщений» против «метода invocation»? В этом случае ответ http://stackoverflow.com/questions/2852381/calling-a-method-or-sending-a-message-in-objective-c является хорошим. – ewernli

ответ

15

Передача сообщений В Java

  • Когда поток отправляет сообщение (объект) к другому потоку.

  • Используется для связи потоков и синхронизации в средах, где потоки не имеют разделяемой памяти. Следовательно, потоки не могут использовать семафоры или мониторы и не могут использовать общие переменные для связи. Передача сообщений все равно может использоваться, конечно, на платформе с общей памятью.

  • Сообщения отправляются по каналу с операцией, такой как передача (канал, сообщение) и принимаются от канала с операцией, такой как прием (канал, сообщение). Сообщения могут передаваться синхронно, что означает, что отправитель блокирует до тех пор, пока принятый не получит прием и приемник, пока отправитель не отправит. Поскольку отправитель и получатель находятся в определенных известных точках своего кода в известный определенный момент времени, синхронная передача сообщений также называется простым рандеву с односторонним потоком информации от отправителя к получателю. Примером является агент шахматной игры. Агенты могут обрабатывать сообщения синхронно, так как они будут квитирования на протяжении всей игры.

  • При передаче асинхронного сообщения отправитель не блокирует. Если приемник не ожидает приема сообщения, сообщение ставится в очередь или буферизируется. Приемник по-прежнему блокируется, если нет сообщения в очереди или буферизации при выполнении приема.

+0

Это действительно помогло. Благодаря! – ericraio

+0

** 1) ** Для взаимодействия между потоками, когда предпочитаете 'send()'/'receive()' over 'get()'/'put()' для общего объекта? ** 2) ** Вы сказали, что передача сообщений может использоваться на платформе общей памяти, но [ответ] (https://stackoverflow.com/a/1853317/3317808) говорит, что * работники не могут изменять данные друг друга. * – overexchange

-1

Ваш вопрос немного расплывчатый, но, я думаю, вы можете ссылаться на Java Message Service API? Если это так, Wikipedia может рассказать вам обо всем: http://en.wikipedia.org/wiki/Java_Message_Service

Но если вы говорите о более «общем» сообщении, то я предлагаю вам взглянуть на ссылку ewernli, опубликованную!

+0

Да. Я спрашиваю, основываясь на вызовах методов на объекте – Pavalesh

12

Классическое взаимодействие между двумя потоками: Производитель и потребитель.

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

Но все же вы используете буфер для доступа к синхронизации. Насколько отличается это от операций 'get()' и 'put()'? – overexchange

Смежные вопросы