【问题标题】:What is message passing?什么是消息传递?
【发布时间】:2011-03-14 10:28:40
【问题描述】:

什么是 Java 中的消息传递?如果可以,请举个例子。

【问题讨论】:

  • 消息传递可以指几个不同的东西,从简单地调用对象的方法,到线程之间的通信,再到不同计算机之间的分布式通信——你想知道哪种类型?
  • 您是指“消息发送”还是“方法调用”?在这种情况下,stackoverflow.com/questions/2852381/… 的答案很好。

标签: java


【解决方案1】:

Java 中的消息传递

  • 当一个线程向另一个线程发送消息(一个对象)时。

  • 用于线程没有共享内存的环境中的线程通信和同步因此线程不能共享信号量或监视器,也不能使用共享变量进行通信。当然,在共享内存平台中仍然可以使用消息传递。

  • 消息通过通道发送,操作类似于发送(通道,消息),并从通道接收,操作类似于接收(通道,消息)。消息可以同步传递,这意味着发送方阻塞直到接收方进行接收,接收方阻塞直到发送方发送。由于发送方和接收方在其代码中的特定已知点在已知的特定时刻处于特定的已知点,因此同步消息传递也称为简单的集合点,具有从发送方到接收方的单向信息流。一个例子是国际象棋游戏代理。代理可以同步处理消息,因为它们将在整个游戏过程中进行握手。

  • 在异步消息传递中,发送方不会阻塞。如果没有接收者等待接收消息,则消息被排队或缓冲。如果在执行接收时没有排队或缓冲的消息,接收器仍然会阻塞。

【讨论】:

  • 1) 对于线程之间的交互,在共享对象上什么时候更喜欢send() / receive() 而不是get() /put()2) 你说消息传递可以在共享内存平台中使用,但是answer 说,workers 不能修改彼此的数据。
【解决方案2】:

两个线程之间的经典交互:生产者和消费者。

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(); 
    } 
} 

【讨论】:

  • 但是您仍然共享一个缓冲区以通过同步访问。这与get()put() 操作有何不同?
【解决方案3】:

您的问题有点含糊,但我猜您可能指的是 Java 消息服务 API?如果是这样,维基百科可以告诉你一切:http://en.wikipedia.org/wiki/Java_Message_Service

但是,如果您谈论的是更“通用”的消息传递,那么我建议您查看 ewernli 发布的链接!

【讨论】:

  • 是的。我是根据对象上的调用方法来问的
猜你喜欢
  • 2018-11-18
  • 1970-01-01
  • 2017-04-21
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 2021-01-29
  • 2010-11-01
  • 1970-01-01
相关资源
最近更新 更多