Java 什么是消息传递?

Java 什么是消息传递?,java,Java,Java中的消息传递是什么?如果可以,请提供一个示例。您的问题有点模糊,但我猜您可能指的是Java消息服务API?如果是这样,维基百科可以告诉你一切: 但是如果你说的是更“通用”的消息传递,那么我建议你看看ewernli发布的链接 Java中的消息传递 当一个线程向另一个线程发送消息(对象)时 用于线程没有共享内存的环境中的线程通信和同步,因此线程不能共享信号量或监视器,也不能使用共享变量进行通信。当然,消息传递仍然可以在共享内存平台中使用 消息通过发送(通道,消息)等操作的通道发送,从接收(

Java中的消息传递是什么?如果可以,请提供一个示例。

您的问题有点模糊,但我猜您可能指的是Java消息服务API?如果是这样,维基百科可以告诉你一切:


但是如果你说的是更“通用”的消息传递,那么我建议你看看ewernli发布的链接

Java中的消息传递

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

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

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

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


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

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

消息传递可以指几种不同的事情,从简单地调用对象上的方法,到线程之间的通信,再到不同计算机之间的分布式通信——您想知道哪种类型?您是指“消息发送”还是“方法调用”?在这种情况下,答案是好的。我是基于调用object上的方法来请求的,但您仍然共享一个缓冲区来通过同步进行访问。对于线程之间的交互,这与
get()
put()
操作有多大不同?1)在共享对象上,何时更喜欢
send()
/
receive()
而不是
get()
/
put()
?2) 您说过消息传递可以在共享内存平台中使用,但表示工作人员不能修改彼此的数据。